C# 当子类不';在抽象类中不使用函数?

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

我正在制作一个简单的web表单来收集客户数据并将其输入数据库。我有5个子类:
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(需要