абстрактный метод в виртуальном классе
Вопрос
У меня есть класс c #, который имеет множество виртуальных методов, некоторые из этих методов по сути абстрактны ( они полностью реализованы в подклассах, а базовый класс пуст).
Чтобы заставить его скомпилироваться, я создаю исключение InvalidOperationException в базовом классе с комментарием о том, что должно быть сделано.Это просто кажется грязным.
Есть ли лучший способ спроектировать мои классы?
Редактировать:Это для среднего уровня приложения, которое будет запускаться в Канаде, половина методов являются универсальными, следовательно, виртуальными.и половина методов специфична для конкретной провинции.
Public class PersonComponent()
{
public GetPersonById(Guid id) {
//Code to get person - same for all provinces
}
Public virtual DeletePerson(Guid id) {
//Common code
}
Public virtual UpdatePerson(Person p) {
throw new InvalidOperation("I wanna be abstract");
}
Public Class ABPersonComponent : PersonComponent
{
public override DeletePerson(Guid id)
{
//alberta specific delete code
}
public override UpdatePerson(Person p)
{
//alberta specific update codecode
}
}
надеюсь, это имеет смысл
Решение
Подумайте о своей иерархии объектов.Хотите ли вы использовать общий код для всех ваших производных классов, затем реализовать базовую функциональность в базовом классе.
При использовании общего базового кода, пожалуйста, обратите внимание на шаблон шаблона.Используйте общедоступный метод и соедините его с защищенным виртуальным методом с основной / совместно используемой реализацией.Завершите имя метода общей реализации словом "Core".
Например:
public abstract class BaseClass
{
protected virtual void DeletePersonCore(Guid id)
{
//shared code
}
public void DeletePerson(Guid id)
{
//chain it to the core
DeletePersonCore(id);
}
}
public class DerivedClass : BaseClass
{
protected override void DeletePersonCore(Guid id)
{
//do some polymorphistic stuff
base.DeletePersonCore(id);
}
}
public class UsageClass
{
public void Delete()
{
DerivedClass dc = new DerivedClass();
dc.DeletePerson(Guid.NewGuid());
}
}
Другие советы
Пометьте базовый класс как абстрактный, а также методы, которые не имеют реализации.
Вот так
public abstract class BaseClass
{
public abstract void AbstractMethod();
}
public class SubClass: BaseClass
{
public override void AbstractMethod()
{
//Do Something
}
}
У вас не может быть абстрактных методов вне абстрактного класса.Пометка класса как абстрактного означает, что вы не сможете создать его экземпляр.Но тогда в этом нет никакого смысла.Что вы собираетесь делать с классом, который в любом случае не реализует методы?
Редактировать: Глядя на ваш класс, да, я бы сделал PersonComponent абстрактным вместе с методом UpdatePerson.Либо это, либо, если UpdatePerson просто ничего не делает для PersonComponent, оставьте все как есть, но сделайте метод UpdatePerson пустым для PersonComponent .