Visual Studio: разработка класса UserControl, производного от абстрактного базового класса - PullRequest
3 голосов
/ 04 мая 2010

Я хочу иметь абстрактный базовый класс для некоторых моих пользовательских UserControl. Причина очевидна: они имеют некоторые общие свойства и методы (базовая реализация некоторых элементов интерфейса на самом деле), и я хочу реализовать их только один раз.

Я сделал это, определив свой абстрактный базовый класс:

public abstract class ViewBase : UserControl, ISomeInterface

Затем я приступил к реализации одного из моих представлений, как обычно, с дизайнером:

public partial class SpecialView : UserControl //all OK

До этого все в порядке. Теперь я заменяю происхождение моего SpecialView класса на абстрактный базовый класс:

public partial class SpecialView : ViewBase //disrupts the designer

Теперь дизайнер Visual Studio 2008 больше не будет работать, заявив: The designer must create an instance of type 'ViewBase' but it cannot because the type is declared as abstract.

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

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

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

Вместо использования абстрактного класса вы можете пометить функции виртуальными и переопределить их в наследующих классах

1 голос
/ 07 декабря 2011

Лучшее решение здесь:

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

Используя его сейчас, он изящен и обходит основную проблему, не нарушая ваш приятный дизайн ООП.

0 голосов
/ 27 сентября 2010

Можно утверждать, что с точки зрения философии дизайна не имеет смысла ожидать возможности работать с абстрактным элементом управления в Designer. Абстрактный класс имеет тенденцию моделировать тип объекта, для которого просто зная, что это «X», не описать его адекватно - нет такой вещи, как абстрактная птица или машина, это всегда особый тип птицы или машины. Если посмотреть на это таким образом, если вы хотите просмотреть пользовательский элемент управления в конструкторе, он имеет , чтобы быть конкретным типом элемента управления, а не абстрактным. Я понимаю, почему это раздражает, но я также понимаю, почему конструктор был закодирован таким образом.

0 голосов
/ 27 сентября 2010

Попробуйте это решение из Urban Potato , которое работало для меня, со странным побочным эффектом , который я никогда не объяснял, и никогда не получал хорошего обходного пути. Может быть, вам повезет и у вас не будет такого побочного эффекта!

...