C# 当子类不';在抽象类中不使用函数?
我正在制作一个简单的web表单来收集客户数据并将其输入数据库。我有5个子类:C# 当子类不';在抽象类中不使用函数?,c#,oop,notimplementedexception,C#,Oop,Notimplementedexception,我正在制作一个简单的web表单来收集客户数据并将其输入数据库。我有5个子类:Customer,Bank,Employee,Owner,和TradeReference,它们继承自抽象类,DataEntryDataEntry具有函数public void InsertSelfIntoDataBase(int-id)。id参数是Customers表中的主键(Bank、Employee、Owner和TradeReference与Customer具有多对一关系),因此客户不需要插入id(CustomerI
Customer
,Bank
,Employee
,Owner
,和TradeReference
,它们继承自抽象类,DataEntry
DataEntry
具有函数public void InsertSelfIntoDataBase(int-id)代码>。id参数是Customers表中的主键(Bank、Employee、Owner和TradeReference与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,这让我感到很烦;好像我无法摆脱那种感觉,我的大学教授不知怎么地知道我,并在默默地评判我。有更好的方法吗?这种情况可能表明抽象类模型不够理想。也许您可以在不使用insertSelfIntoDataBase(int)
方法的情况下实现抽象类DataEntry
,然后派生第二个抽象类,例如定义抽象方法insertSelfIntoDataBase(int)的SelfInsertingDataEntry:DataEntry
,这样具体的类就可以从其中任何一个继承,这取决于它们是否实现了方法
使用此技巧,与其他方法相关的多态性将被保留,因为任何具体实例(无论是否实现了insertSelfIntoDataBase
)都可以转换为类型DataEntry
@Recursive在一条评论中也有很好的观点,建议将insertSelfIntoDataBase
方法移动到一个接口中。然后,您可以使您的数据条目
类层次结构严格地与条目类型分类法相关,并允许部分、无或所有后代实现或不实现他们希望的接口,而不需要他们切换其父类。这种情况可能表明抽象类模型不够理想。也许您可以在不使用insertSelfIntoDataBase(int)
方法的情况下实现抽象类DataEntry
,然后派生第二个抽象类,例如定义抽象方法insertSelfIntoDataBase(int)的SelfInsertingDataEntry:DataEntry
,这样具体的类就可以从其中任何一个继承,这取决于它们是否实现了方法
使用此技巧,与其他方法相关的多态性将被保留,因为任何具体实例(无论是否实现了insertSelfIntoDataBase
)都可以转换为类型DataEntry
@Recursive在一条评论中也有很好的观点,建议将insertSelfIntoDataBase
方法移动到一个接口中。然后,您可以使您的数据条目
类层次结构严格地与条目类型分类法相关,并允许部分、无或所有后代实现或不实现他们希望的接口,而不需要他们切换其父类。不管Robert Columbia指出的类设计注意事项,我想谈谈我对NotImplementedException
的看法
在.NET Framework中还有另一个众所周知的异常,它更适合此目的--不支持异常
。它表示操作不受实现的支持-而受设计的支持,并且不受缺少实现功能的代码的支持
NotImplementedException
相当于一个指示器,它表明实现将并且应该在未来完成不管罗伯特·哥伦比亚(Robert Columbia)指出的关于类设计的警告,我想谈谈我对NotImplementedException
的看法
在.NET Framework中还有另一个众所周知的异常,它更适合此目的--不支持异常
。它表示操作不受实现的支持-而受设计的支持,并且不受缺少实现功能的代码的支持
NotImplementedException
相当于一个指示符,实现将并且应该在将来完成如果它不是关键的,如果它被调用/未被调用,并且返回类型是void
,那么只需将方法主体留空。或者只需用/
注释掉trowing异常。注意,这是您的类建模不太正确的迹象。也许你可以从基类中删除该方法,并将其放在ISelfDatabaseInsertable
或其他什么东西上。为什么要从DataEntry
继承Customer
?你的大学教授不是在默默地评判你。。。我听到他们在喊“!”;)如果它不是关键的,如果它被调用/未被调用,并且返回类型为void
,则只需将方法体留空。或者只需用/
注释注释掉trowing异常。注意,这是您的类建模不太正确的迹象。也许你可以从基类中删除该方法,并将其放在ISelfDatabaseInsertable
或其他什么东西上。为什么要从DataEntry
继承Customer
?你的大学教授不是在默默地评判你。。。我听到他们在喊“!”;)因此,可以使用OnetoOneDataEntry(不需要插入id)、OneToManyDataEntry(需要插入1个id)和ManyToManyDataEntry(需要