通用基类

时间:2019-07-02 15:59:37

标签: c# generics inheritance multiple-inheritance generic-programming

我正在从现有库中进行自定义,该库具有以下结构:

public class BaseClass
{
    public Method1();
    public Method2();
}
public class A : BaseClass
{
    public Method1();
    public Method2();
}
public class B : BaseClass
{
    public Method1();
    public Method2();
}
public class C : BaseClass
{
    public Method1();
    public Method2();
}

以上是我无法更改的代码。

现在,我需要对A,B,C进行累加,但是每个继承中的所有更改都完全相同。逻辑和代码完全相同。

public class BaseClass1 : BaseClass
{
    public override Method1(); //some logic changed comparing to base
}
public class A1 : A
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}
public class B1 : B
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}
public class C1 : C
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}

在每个类中,所有代码都是重复的,复制粘贴的。

我的问题是:如何避免复制粘贴的代码?

此代码无法正常工作:

public class BaseClass1<T> : T where T: BaseClass  //Base class cannot be T
{
    public override Method1(); 
    public override Method2(); 
}

我不想重复代码的原因是有C,D,E,F等继承。

1 个答案:

答案 0 :(得分:0)

作为一种选择,您可以使用装饰器模式的一种变体, (确切的库签名是未知的,因此我添加了重写或隐藏方法的示例) 下面的示例:

// original libary code
public class BaseClass
{
    public virtual string Method1() => "m1 of base";
    public string Method2() => "m2 of base";
}
public class A : BaseClass
{
    public override string Method1() => "m1 A";
    public string Method2() => "m2 A";
}
public class B : BaseClass
{
    public override string Method1() => "m1 B";
    public string Method2() => "m2 B";
}
public class C : BaseClass
{
    public override string Method1() => "m1 C";
    public string Method2() => "m2 C";
}


// methods to be overridden
public interface IMethodOfBase
{
    void Method1();
    void Method2();
}

// common behaviour
public class Decorator:IMethodOfBase
{
    private BaseClass b;

    public Decorator(BaseClass b)
    {
        this.b = b;
    }

    public void Method1()
    {
        Console.WriteLine($"overridden behaviour in one place {b.Method1()}");
    }

    public void Method2()
    {
        Console.WriteLine($"overridden behaviour in one place {b.Method2()}");
    }
}

// example usage
public class WorkLoad
{
    private List<Decorator> _work; 

    public WorkLoad()
    {
        _work = new List<Decorator>
        {
            new Decorator(new A()),
            new Decorator(new B()),
            new Decorator(new C()) //etc
        };
    }

    public void DoWork()
    {
        _work.ForEach( n =>
        {
            n.Method1();
            n.Method2();
        });
    }

}

并运行它

WorkLoad workLoad = new WorkLoad();
workLoad.DoWork();

并输出: 在一个地方m1 A的覆盖行为

在一处m2的基础中被覆盖的行为

在一个地方m1 B中的替代行为

在一处m2的基础中被覆盖的行为

在一处m1 C处的替代行为

在一处m2的基础中被覆盖的行为