Вопрос

У меня есть класс 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top