我正在从现有库中进行自定义,该库具有以下结构:
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等继承。
答案 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的基础中被覆盖的行为