Абстрактный метод в виртуальном классе
У меня есть AC# Class, который имеет много виртуальных методов, некоторые из этих методов по существу абстрактны (они полностью реализованы в подклассах, а базовый класс пуст).
Чтобы получить его для компиляции, я выкидываю исключение 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
}
}
надеюсь, что это имеет смысл
2 ответа
Подумайте о вашей иерархии объектов. Вы хотите поделиться общим кодом для всех ваших производных классов, а затем реализовать базовую функциональность в базовом классе.
Если вы поделились базовым кодом, обратите внимание на шаблон. Используйте публичный метод и связывайте его с защищенным виртуальным методом с помощью базовой / разделяемой реализации. Завершите разделяемое имя метода реализации "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.