代码之家  ›  专栏  ›  技术社区  ›  RPM1984

提供公共和派生组合功能的抽象/虚拟成员-C#

  •  3
  • RPM1984  · 技术社区  · 15 年前

    我以前也这样做过-只是记不起诀窍。

    如果我有一个 摘要 班级:

    公共抽象类岗位

    还有一套 推导 课程:

    公开课照片:Post

    我想 派生类以实现名为 验证() ,但同时提供 核心 在验证 岗位 水平。

    我可以创建一个方法: 公共抽象void Validate() 在里面 岗位 ,这将强制派生类实现该方法,但我如何执行 岗位 (基础)验证?

    最终的结果是我希望能够做到:

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

    我该怎么做?

    2 回复  |  直到 15 年前
        1
  •  10
  •   jjnguy Julien Chastang    15 年前

    这是你想要的:

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

    这将强制基类实现验证技术,并且外部用户将调用基类验证。

    不可能使方法抽象,并提供默认实现。

        2
  •  4
  •   James Kovacs    15 年前

    在基类中创建公共模板方法,并让它调用派生类验证方法:

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

    这将强制派生类实现该方法,但为Post类提供公共验证逻辑。注意Validate()本身不是虚拟的。这比强迫派生类记住调用base.Validate()更安全。