Есть ли альтернатива использованию 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
скорее указатель, что реализация будет и должна быть сделана в будущем.