2009-03-05 113 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