Проблема множественного наследования в C # - PullRequest
5 голосов
/ 28 августа 2009

Я нахожусь в ситуации, когда мне нужно использовать множественное наследование в C # с WPF.

Я делаю элемент управления, скажем, Control-1, который получен из элемента управления combobox. Я добавил некоторые свойства зависимостей, а также методы в мой класс Control-1 control. Большинство свойств и методов (влияющих на ту же реализацию свойств и методов) в моем control-1 также можно использовать в другом элементе управления, называемом Control-2, но этот элемент управления не следует извлекать из элемента управления combobox (как в случае с Control- 1).

Я хочу отделить общие свойства и методы зависимостей в другом классе, но разделение его в другом классе требует, чтобы я получил свой класс управления (control-1) из элемента управления combobox и общий класс, содержащий свойства и методы.

Есть ли дизайн, который может решить мою проблему.

Примечание. Речь идет о C #, использующем свойства зависимостей каркаса WPF, которые требуют статических членов, а не только о C # в целом.

Относящиеся

Как повторно использовать код, когда множественное наследование невозможно?

Множественное наследование в C #

Как реализовать общее поведение между классами (без многократного наследования, конечно) в C #

Какие есть хорошие альтернативы множественному наследованию в .NET?

Ответы [ 5 ]

4 голосов
/ 28 августа 2009

Одно из решений, которое может работать для вас, - это создать интерфейс и поместить вашу реализацию в методы расширения.

2 голосов
/ 28 августа 2009

звучит как хорошее время для использования шаблона декоратора. Вот некоторые ресурсы:

http://www.c -sharpcorner.com / UploadFile / rmcochran / csharp_wrapper302122006080905AM / csharp_wrapper3.aspx

http://andrewtroelsen.blogspot.com/2009/04/decorator-pattern-extension-methods.html

0 голосов
/ 15 февраля 2010

Проблема с методами расширения и интерфейсами заключается в том, что свойства зависимостей требуют объявления статических членов и открытых свойств, например:

    public PermissionEnum Permission
    {
        get { return (PermissionEnum)GetValue(PermissionProperty); }
        set { SetValue(PermissionProperty, value); }
    }

    public static readonly DependencyProperty PermissionProperty =
        DependencyProperty.Register("Permission", typeof(PermissionEnum), typeof(SecurityMenuItem), new FrameworkPropertyMetadata(PermissionEnum.DeliveryView));
0 голосов
/ 28 августа 2009

Я использовал заглушки, которые вызываются из производного класса и принимают класс базового типа в качестве аргумента. Это оставляет меня с несколькими однострочными функциями. Жаль.

0 голосов
/ 28 августа 2009

Я не могу напрямую говорить о ситуации со свойством зависимости, поэтому расскажу об общей проблеме, если это будет полезно.

Вы не можете сделать множественное наследование реализации в C #. Однако вы можете прикрепить интерфейс.

Таким образом, вы можете определить интерфейс:

interface IWhatever
{
    ...
}

И затем вы можете реализовать функции этого интерфейса в классе следующим образом:

class M : IWhatever
{
}

И теперь вы берете классы, для которых вы хотели бы иметь эту дополнительную функциональность:

class B : MustExtend, IWhatever
{
    private M myMImpl = new M();

   // implement functions, call to 'myMImpl' for implementation.
}

Это называется «композиция». Это может быть полезно в некоторых обстоятельствах и, как правило, используется недостаточно, я думаю:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...