Есть ли альтернатива использованию NotImplementedException, когда подкласс не использует функцию в абстрактном классе?

Я делаю простую веб-форму для сбора данных о клиентах и ​​ввода их в базу данных. У меня есть 5 подклассов: Customer, Bank, Employee, Owner, а также TradeReference которые наследуются от абстрактного класса, DataEntry, DataEntry имеет функцию public void InsertSelfIntoDataBase(int id);, Параметр id является первичным ключом из таблицы "Клиенты" (Банк, Сотрудник, Владелец и TradeReference имеют отношение "много к одному" с Клиентом), поэтому Customer не нужно вставлять идентификатор (CustomerID автоматически увеличивается в базе данных).

В настоящее время мой код настроен так, чтобы Bank, Employee, Owner, а также TradeReference реализует InsertSelfIntoDataBase функция в родительском классе, в то время как Customer выдает NotImplementedException, поэтому код для Customer Код класса выглядит примерно так:

public int InsertSelfIntoDataBase()
{
    int customerID = InsertCustomerAndReturnScalor();
    return customerID;
}


public override void insertSelfIntoDataBase(int id)
{    throw new NotImplementedException("Customer does not use this function");    }

Эта реализация работает, но мне жаль, что я должен использовать NotImplementedException; Как будто я не могу избавиться от ощущения, что мои профессора из колледжа как-то знают и молча осуждают меня. Есть ли лучший способ сделать это?

2 ответа

Решение

Такая ситуация может указывать на неидеальную модель абстрактного класса. Возможно, вы могли бы реализовать абстрактный класс DataEntry без insertSelfIntoDataBase(int) метод, а затем получить второй абстрактный класс, такой как SelfInsertingDataEntry : DataEntry который определяет абстрактный метод insertSelfIntoDataBase(int) так что конкретные классы могут наследовать от одного в зависимости от того, реализуют ли они метод или нет.

С помощью этого трюка полиморфизм, связанный с другими методами, будет сохранен с любого конкретного экземпляра (независимо от того, реализован он или нет). insertSelfIntoDataBase) может быть приведен к типу DataEntry,

@Recursive также имеет хороший комментарий в комментарии, предлагая переместить insertSelfIntoDataBase метод в интерфейс. Вы могли бы тогда сохранить свой DataEntry иерархия классов строго связана с таксономией типа Entry и позволяет некоторым, ни одному, или всем потомкам реализовывать или не реализовывать интерфейс так, как они хотят, не требуя от них переключения своего родителя.

Независимо от предостережений о дизайне класса, как указал Роберт Колумбия, я хотел бы высказать свои мысли о NotImplementedException,

В.NET Framework есть еще одно известное исключение, которое лучше подходит для этой цели - NotSupportedException, Это сигнализирует о том, что операция не поддерживается реализацией, а скорее дизайном, а не отсутствием кода, реализующего функцию.

NotImplementedException скорее указатель, что реализация будет и должна быть сделана в будущем.

Другие вопросы по тегам