当子类不使用抽象类中的函数时,是否有替代方法使用NotImplementedException ?
本文关键字:是否 方法 NotImplementedException 函数 子类 抽象类 | 更新日期: 2023-09-27 18:04:46
我正在制作一个简单的web表单来收集客户数据并将其输入数据库。我有5个子类:Customer
, Bank
, Employee
, Owner
和TradeReference
,它们继承自抽象类DataEntry
。DataEntry
有一个函数public void InsertSelfIntoDataBase(int id);
。id参数是Customers Table中的主键(Bank、Employee、Owner和TradeReference与Customer有多对一关系),因此Customer
不需要插入id (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;就像我无法摆脱一种感觉,那就是我大学里的教授不知怎么知道我,并在默默地评判我。有更好的方法吗?
不考虑Robert Columbia指出的关于类设计的注意事项,我想谈谈我对NotImplementedException
的看法。
在。net框架中有另一个众所周知的异常,它更适合这个目的——NotSupportedException
。它表示实现()不支持某个操作,而不是由于设计()而不是由于缺少实现该特性的代码。
NotImplementedException
更像是一个指示器,一个的实现将会并且应该在未来完成。
这种情况可能表明抽象类模型不太理想。也许你可以在没有insertSelfIntoDataBase(int)
方法的情况下实现抽象类DataEntry
,然后派生第二个抽象类,比如SelfInsertingDataEntry : DataEntry
,它定义了抽象方法insertSelfIntoDataBase(int)
,这样具体类就可以根据是否实现该方法继承其中的任何一个。
使用此技巧,与其他方法相关的多态性将被保留,因为任何具体实例(无论它是否实现了insertSelfIntoDataBase
)都可以被强制转换为类型DataEntry
。
@Recursive在评论中也有一个很好的观点,建议将insertSelfIntoDataBase
方法移动到接口中。然后,您可以保持您的DataEntry
类层次结构与Entry类型分类法严格相关,并允许一些、没有或所有的后代按照自己的意愿实现或不实现接口,而不需要它们切换它们的父类。