Интерфейс и смесь базовых классов, правильный способ реализовать это - PullRequest
2 голосов
/ 08 июня 2010

У меня есть некоторые пользовательские элементы управления, для которых я хочу указать свойства и методы.

Они наследуются от базового класса, потому что все они имеют такие свойства, как "Foo" и "Bar", и причина, по которой яиспользуется базовый класс, так что мне не нужно вручную реализовывать все эти свойства в каждом производном классе.

Однако я хочу иметь метод, который есть только в производных классах, а не в базовом классе,так как базовый класс не знает, как «делать» метод, поэтому я думаю об использовании интерфейса для этого.Если я помещаю его в базовый класс, мне нужно определить какое-то тело для возврата значения (которое будет недействительным) и всегда следить за тем, чтобы переопределяющий метод не вызывал базовый.method

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

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

РЕДАКТИРОВАТЬ : Спасибо всем людям с вашими отличными абстрактными предложениями, но это ломает дизайнера.Если бы абстракция не была выбором, что бы вы сделали?

Ответы [ 5 ]

5 голосов
/ 08 июня 2010

В качестве альтернативы вы можете определить метод как «абстрактный» в базовом классе, что не потребует от класса его реализации. Например:

abstract class A
{
   public abstract void B();
}

Конечно, это заставит ваш базовый класс быть также абстрактным, но, похоже, это будет хорошо работать для вас.

См. Абстрактные методы в MSDN.

Обновление

Поскольку abstract не подходит для вас из-за проблем с конструктором, вы можете просто определить метод как часть вашего базового класса и заставить его генерировать NotImplementedException , если он вызывается непосредственно из Базовый класс:

void DerivMethod()
{
    // Must be implemented by derived class
    throw new NotImplementedException();
}

В противном случае, можно использовать interface, особенно если вышеперечисленное оставляет неприятный вкус во рту ...

2 голосов
/ 08 июня 2010

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

http://msdn.microsoft.com/en-us/library/aa664435(VS.71).aspx

1 голос
/ 08 июня 2010

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

Я бы реализовал методы интерфейса в базовом классе. Вы можете вызвать исключение NotImplemented или Assert.Fail в методах, если хотите убедиться, что наследники корректно переопределяют эти методы.

1 голос
/ 08 июня 2010

Отметьте метод как абстрактный в вашем базовом классе. Вы будете вынуждены реализовать его в производных классах, но базовому классу не нужно иметь определение метода.

0 голосов
/ 08 июня 2010

Объявите сигнатуру функции в базовом классе и используйте модификатор "abstract".

...