Расширение двух базовых классов в C # альтернатива

1

Я понимаю, что вы не можете распространять два базовых класса в С#. То, что я хочу сделать, в конечном счете расширяет функциональность стандартного класса Windows Form, который я не могу сделать, потому что он не является открытым исходным кодом.

Таким образом, все мои формы имеют 5 общих функций. Существует тонна избыточного кода. Кроме того, проблема разворачивается наружу, потому что у меня есть другие классы, которые должны вызывать эти повторяющиеся функции.

Основной пример следующий.

public class A : Form {

   B b;

   public A() {
      b = new B(this);
   }

   private void back() {
      b.go();
   }
}

public class B {

   public void go(Object obj)
   {
      //if obj is of type A
      //call (A) obj.back();
      //if obj is of type C
      //call (C) obj.back();
      //etc...
   }

Причина, по которой я перехожу между классами, как это, заключается в том, что это приложение MVC, поэтому различные функции предполагаются находиться в разных местах, чтобы упростить их поддержку.

В результате этого так было очень сложно поддерживать. Есть ли какие-то умные способы обойти это, чего я не знаю?

Любые предложения,

Благодарю.

Теги:
asp.net-mvc
design

2 ответа

3

Для этой конкретной проблемы используйте интерфейс:

interface IGoBackAndForth { void back(); }

public class A : Form, IGoBackAndForth { }
public class C : ..., IGoBackAndForth { }

public void go(Object obj)
{
   var baf = object as IGoBackAndForth;
   if (baf != null) baf.back();
}
  • 0
    Спасибо, это ответило на вопрос, так как я отлично его сформулировал, но, думаю, я не опубликовал достаточно кода. Без публикации страниц и страниц кода трудно объяснить проблему. Я на самом деле попробовал это и переписал много вещей, но это всегда приводит к одному пункту пути, где необходимо выполнить приведение, но это мне не позволит :( Спасибо, хотя это идеальный ответ на вопрос, который я задал.
  • 0
    Мы не можем отвечать на вопросы, которые не задавались. Есть аналогичные решения и в больших масштабах.
0

Вы захотите расширить System.Windows.Forms.Form, но также примените свой собственный интерфейс IHaveAllThoseNavigationFunctions --or, как вы хотите его назвать.

public interface ISupportAllThoseNavigationFunctions
{
    NavigableWindowsForm PreviousLocation { get; set; }

    void go(NavigableWindowsForm destination);
    void back();
}

public partial class NavigableWindowsForm : Form, ISupportAllThoseNavigationFunctions
{
    private NavigableWindowsForm PreviousLocation { get; set; }

    go(NavigableWindowsForm destination)
    {
       //...
    }

    back()
    {
       go(PreviousLocation);
    }
}

public class FormA : NavigableWindowsForm
{
    // todo: implement form A specifics
}

public class FormB : NavigableWindowsForm
{ 
    // todo: implement form B specifics
}

Это ограничит ваше повторение и предоставит все необходимые функции в базовом классе NavigableWindowsForm, который у вас теперь есть.

  • 0
    Это потрясающий ответ. Это на самом деле пришло мне в голову, но я просто подумал, что если бы я сделал это таким образом, то VS не будет автоматически генерировать мой код проектирования, так как я перетаскиваю его, но я надеюсь, что ошибся в этом, попробую сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню