我有一个c#类,它有很多虚方法,其中一些方法本质上是抽象的(它们完全在子类中实现,基类是空的)。
为了让它进行编译,我在基类中抛出一个InvalidOperationException,并对应该做什么做出评论。这只是感觉很脏。
有没有更好的方法来设计我的课程?
编辑: 对于将在加拿大运行的应用程序的中间层,一半的方法是通用的,因此是虚拟的。一半的方法都是省特定的。
Public class PersonComponent()
{
public GetPersonById(Guid id) {
//Code to get person - same for all provinces
}
Public virtual DeletePerson(Guid id) {
//Common code
}
Public virtual UpdatePerson(Person p) {
throw new InvalidOperation("I wanna be abstract");
}
Public Class ABPersonComponent : PersonComponent
{
public override DeletePerson(Guid id)
{
//alberta specific delete code
}
public override UpdatePerson(Person p)
{
//alberta specific update codecode
}
}
希望这是有道理的
答案 0 :(得分:15)
将基类标记为抽象,以及没有实现的方法。
喜欢这样
public abstract class BaseClass
{
public abstract void AbstractMethod();
}
public class SubClass: BaseClass
{
public override void AbstractMethod()
{
//Do Something
}
}
您不能在抽象类之外使用抽象方法。将类标记为抽象意味着您将无法实例化它。但那时它没有任何意义。对于没有实现这些方法的类,你打算做什么?
编辑:从查看您的课程,是的,我会将PersonComponent与UpdatePerson方法一起使用。要么是这样,或者如果UpdatePerson没有为PersonComponent做任何事情,请保持原样,但为PersonComponent使UpdatePerson方法为空。
答案 1 :(得分:1)
考虑您的对象层次结构。是否要为所有派生类共享公共代码,然后在基类中实现基本功能。
在共享基本代码时,请注意模板模式。使用公共方法并使用核心/共享实现将其链接到受保护的虚拟方法。使用“Core”结束共享实现methodname。
例如:
public abstract class BaseClass
{
protected virtual void DeletePersonCore(Guid id)
{
//shared code
}
public void DeletePerson(Guid id)
{
//chain it to the core
DeletePersonCore(id);
}
}
public class DerivedClass : BaseClass
{
protected override void DeletePersonCore(Guid id)
{
//do some polymorphistic stuff
base.DeletePersonCore(id);
}
}
public class UsageClass
{
public void Delete()
{
DerivedClass dc = new DerivedClass();
dc.DeletePerson(Guid.NewGuid());
}
}