2009-03-05 112 views
4

我有一个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 
    } 

} 

希望这是有道理的

回答

1

想想你的对象层次结构。你想分享所有派生类的通用代码,然后在基类中实现基本功能。

当共享基本代码时,请注意模板模式。使用公共方法并使用核心/共享实现将其链接到受保护的虚拟方法。使用“Core”结束共享实现方法名称。

例如:

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()); 
    } 
} 
+0

正是我之后 Ta。 – aaron 2009-03-06 01:00:24

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方法为空。

+0

我已经与抽象基类。任何公共代码都可以在基类的受保护(而非抽象)方法中调用。 更新preson方法抛出异常的原因是因为它返回的东西在实际代码中,它不会生成(函数不返回任何错误) – aaron 2009-03-05 07:22:22