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

Is there an alternative to using a NotImplementedException when a subclass doesn't use a function in an abstract class?

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

目前,我的代码设置为 BankEmployeeOwnerTradeReference 在父 InsertSelfIntoDataBase 中实现 InsertSelfIntoDataBase 函数=34=],而 Customer 抛出 NotImplementedException,所以 Customer class 的代码看起来有点像这样:

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


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

此实现有效,但它让我感到困扰,因为我必须使用 NotImplementedException;就像我无法摆脱这样一种感觉,即我的大学教授不知何故知道并在默默地评判我。有更好的方法吗?

这种情况表明抽象 class 模型不太理想。也许您可以在没有 insertSelfIntoDataBase(int) 方法的情况下实现抽象 class DataEntry,然后派生第二个抽象 class,例如定义抽象方法 [=11] 的 SelfInsertingDataEntry : DataEntry =] 以便具体的 classes 可以从任何一个继承,具体取决于它们是否实现了该方法。

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

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

不管 Robert Columbia 指出的关于 class 设计的警告,我想谈谈我对 NotImplementedException 的看法。

在 .NET Framework 中有另一个众所周知的异常,它更适合这个目的 - NotSupportedException。它表示实现不支持操作 - 而不是设计支持,而不是缺少实现功能的代码。

NotImplementedException 更像是一个指标,将来会而且应该实施