当 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:Customer
、Bank
、Employee
、Owner
和 TradeReference
,它们继承自抽象 [=34] =]、DataEntry
。 DataEntry
有一个函数 public void InsertSelfIntoDataBase(int id);
。 id 参数是来自 Customers Table 的主键(Bank、Employee、Owner 和 TradeReference 与 Customer 具有多对一的关系),因此 Customer
不需要 id已插入(CustomerID 在数据库中自动递增)。
目前,我的代码设置为 Bank
、Employee
、Owner
和 TradeReference
在父 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
更像是一个指标,将来会而且应该实施。
我正在制作一个简单的 Web 表单来收集客户数据并将其输入数据库。我有 5 个子 classes:Customer
、Bank
、Employee
、Owner
和 TradeReference
,它们继承自抽象 [=34] =]、DataEntry
。 DataEntry
有一个函数 public void InsertSelfIntoDataBase(int id);
。 id 参数是来自 Customers Table 的主键(Bank、Employee、Owner 和 TradeReference 与 Customer 具有多对一的关系),因此 Customer
不需要 id已插入(CustomerID 在数据库中自动递增)。
目前,我的代码设置为 Bank
、Employee
、Owner
和 TradeReference
在父 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
更像是一个指标,将来会而且应该实施。