2010-11-18 36 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