当子类不使用抽象类中的函数时,是否有替代方法使用NotImplementedException ?

本文关键字:是否 方法 NotImplementedException 函数 子类 抽象类 | 更新日期: 2023-09-27 18:04:46

我正在制作一个简单的web表单来收集客户数据并将其输入数据库。我有5个子类:Customer, Bank, Employee, OwnerTradeReference,它们继承自抽象类DataEntryDataEntry有一个函数public void InsertSelfIntoDataBase(int id);。id参数是Customers Table中的主键(Bank、Employee、Owner和TradeReference与Customer有多对一关系),因此Customer不需要插入id (CustomerID在数据库中是自动递增的)。

目前,我的代码设置使Bank, Employee, OwnerTradeReference在父类中实现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;就像我无法摆脱一种感觉,那就是我大学里的教授不知怎么知道我,并在默默地评判我。有更好的方法吗?

当子类不使用抽象类中的函数时,是否有替代方法使用NotImplementedException ?

不考虑Robert Columbia指出的关于类设计的注意事项,我想谈谈我对NotImplementedException的看法。

在。net框架中有另一个众所周知的异常,它更适合这个目的——NotSupportedException。它表示实现()不支持某个操作,而不是由于设计()而不是由于缺少实现该特性的代码。

NotImplementedException更像是一个指示器,一个的实现将会并且应该在未来完成

这种情况可能表明抽象类模型不太理想。也许你可以在没有insertSelfIntoDataBase(int)方法的情况下实现抽象类DataEntry,然后派生第二个抽象类,比如SelfInsertingDataEntry : DataEntry,它定义了抽象方法insertSelfIntoDataBase(int),这样具体类就可以根据是否实现该方法继承其中的任何一个。

使用此技巧,与其他方法相关的多态性将被保留,因为任何具体实例(无论它是否实现了insertSelfIntoDataBase)都可以被强制转换为类型DataEntry

@Recursive在评论中也有一个很好的观点,建议将insertSelfIntoDataBase方法移动到接口中。然后,您可以保持您的DataEntry类层次结构与Entry类型分类法严格相关,并允许一些、没有或所有的后代按照自己的意愿实现或不实现接口,而不需要它们切换它们的父类。