2010-11-18 17 views
3

我以前做過這個 - 只是不記得這個技巧。摘要/虛擬成員提供通用和派生組合功能 - C#

如果我有一個抽象類:

公共抽象類崗位

而且一組獲得類:

公共類圖片:發表

我要force派生類實現一種方法,稱爲驗證(),但同時提供核心驗證在級別。在公共抽象void驗證(),這將迫使派生類來實現的方法,但後來我如何執行郵政(基地)驗證:

我能創造一個方法?

最終的結果是我希望能夠做到這一點:

public class BLL 
{ 
    public void AddPost(Post post) 
    { 
     post.Validate(); // includes "Post" validation, any deriving validation. 
     repository.Add(post); 
    } 
} 

我該怎麼辦呢?

回答

10

這裏是你想要的東西:

public abstract class Post { 

    // Default validation technique 
    public void Validate() 
    { 
     // your base validation 
     // Then call the specific validation technique 
     ExtraValidate(); 
    } 

    // Forces subclasses to provide validation technique 
    protected abstract void ExtraValidate(); 
} 

這將迫使基類來實現驗證的技術,並基本驗證將由外部用戶調用。

這是不可能的,使一個方法抽象,並提供一個默認的實現。

+0

唉 - 就是這樣!輝煌 - 歡呼聲。 :) – RPM1984 2010-11-18 23:02:13

+0

@RPM,很高興幫助! – jjnguy 2010-11-18 23:02:36

4

建立在基類中的公共模板方法,並調用它的派生類的驗證方法:

public abstract class Post { 
    public void Validate() { 
     // Post validation 
     ValidateDerived(); 
    } 

    protected abstract void ValidateDerived(); 
} 

這迫使派生類來實現的方法,但是對於Post類提供了常見的驗證邏輯。請注意,Validate()本身不是虛擬的。這比強制派生類必須記住調用base.Validate()更安全。

+0

這與我的回答有何不同? – jjnguy 2010-11-18 22:50:16

+1

沒有區別。當我開始回答這個問題時,你的回答就不存在了。我贊成你的回答要禮貌。 – 2010-11-18 22:55:37

+0

我將返回此優惠。我的意思不是粗魯無禮。我只是好奇,如果你的意思與我發佈的不同。 – jjnguy 2010-11-18 22:56:46