繁体   English   中英

具有继承类且实现方法为空的抽象类的设计模式

[英]design pattern for the case of abstract class with inheriting classes with empty implementation methods

您能否为以下情况推荐一个良好的实践模式:我有一个定义抽象行为的基本抽象类,以及两个继承类,每个继承类定义了一组方法,这些方法将一个实现与另一个实现区分开。 然后在创建代码中(通过配置说),我针对每种配置设置选择所需的实现,并调用“ doWork”,我的问题是如何避免在继承类中使用“空”实现,以防继承类选择不执行该方法。

abstract class CommonParentClass{
    public void doWork()
    {
      commonA();
      commonB();
      uniqueA();
      uniqueB();
    }
    internal  void commonA()
    {
        //do work which is same for inheriting classes
    }
    internal void commonB()
    {
       //do work which is same for inheriting classes
    }   
    abstract void uniqueA(); 
    abstract void uniqueB();
    abstract void uniqueC();    
}

class FirstChildClass:CommonParentClass
{
        protected void uniqueA()
        {
            //implementation specific to first child
        }
        protected void uniqueB()
        {
            //EMPTY
        }   
        protected void uniqueC()
        {
            //implementation specific to first child
        }       
}

class SecondChildClass:CommonParentClass
{
        protected void uniqueA()
        {
            EMPTY
        }
        protected void uniqueB()
        {
            //implementation specific to second child
        }
        protected void uniqueC()
        {
            //implementation specific to second child
        }       
}

我有大约5/6个方法,这些方法在继承类之一中为空。 我应该使用哪种设计模式来克服这个问题并避免代码重复?

鉴于所有这些功能似乎都具有相同的签名,可以想象可以使用Action列表。

abstract class CommonParent
{
    private readonly List<Action> _funcs = new List<Action>();

    private void CommonA() { }
    private void CommonB() { }

    protected void AddAction(Action action) => _funcs.Add(action);

    protected CommonParent()
    {
        _funcs.Add(CommonA);
        _funcs.Add(CommonB);
    }

    internal void Execute()
    {
        foreach(Action action in _funcs)
            action();
    }
}

class FirstChildClass : CommonParent
{
    private void UniqueA() { }
    private void UniqueB() { }
    private void UniqueC() { }
    public FirstChildClass()
    {
        AddAction(UniqueA);
        AddAction(UniqueB);
        AddAction(UniqueC);
    }
}


class SecondChildClass : CommonParent
{
    private void UniqueD() { }
    private void UniqueE() { }
    private void UniqueF() { }
    public SecondChildClass()
    {
        AddAction(UniqueD);
        AddAction(UniqueE);
        AddAction(UniqueF);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM