Является ли эта практика наследуемых общих функций ASP.NET приемлемой? - PullRequest
2 голосов
/ 01 августа 2009

У меня есть куча разных форм, для которых я хотел бы создать базовый класс MustInherit. Одна функция, которую я хотел бы, чтобы они все содержали - это общая функция с именем GetForms(). Я знаю, что вы не можете объявить разделяемую функцию MustOverride, поэтому я сделал следующее в своем абстрактном классе:

Public Shared Function GetForms() As List(Of OrderForm)
    'to be overridden in child class'
    Return Nothing
End Function

А это в моем детском классе:

Public Overloads Shared Function GetForms() As List(Of OrderForm)
    'do stuff'
End Function

Это вызовет проблемы в будущем или это приемлемый обходной путь? У него есть запах, но он заставит все мои формы включать общую функцию GetForms.

РЕДАКТИРОВАТЬ Я понимаю, что если бы это было возможно с интерфейсами, я бы использовал один, но вы не можете объявить общие функции в интерфейсах, и я хотел бы убедиться, что это функция SHARED. 1014 *

Ответы [ 5 ]

3 голосов
/ 01 августа 2009

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

Вы упоминаете, что ваша причина для этого заключается в том, что ' заставит все мои формы включать общую функцию GetForms '. Это только отчасти правда. Да, все они будут иметь функцию GetForms, но вы на самом деле не заставляете производные классы реализовывать свою собственную версию. Если вы забудете реализовать функцию для одного из них, вы будете вызывать базовую версию и не получите никаких предупреждений об этом от компилятора.

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

Если вы хотите принудить поведение, вы должны сделать это, используя члены экземпляра; используя MustOverride (абстрактные) функции или интерфейс.

1 голос
/ 02 августа 2009

У вас могут быть подобные статические (Shared) методы, но вы не можете принудительно реализовать их.

Каждый статический метод является локальным для своего класса, вы не можете перегрузить его в дочернем классе или сделать его абстрактным (MustInherit). Вы должны использовать метод экземпляра (нестатический), чтобы получить требуемые объектно-ориентированные аспекты.

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

Статические методы не наследуются, поэтому мы не должны поощрять ожидание переопределения. Другими словами, я думаю, что вы можете лаять не на то дерево.

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

Почему бы вам просто не объявить это как:

Public MustOverride Function GetForms() As List(Of OrderForm)?
0 голосов
/ 01 августа 2009

Да, это пахнет!

Похоже, вы должны использовать интерфейс вместо.

Вот статья на vb.net: http://www.developer.com/lang/other/article.php/939411

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