Wer*_*ens 2 c# inheritance multiple-inheritance
namespace NUnitTestAbstract
{
public abstract class BaseTestClass1
{
public abstract void BaseTestClass1Method();
}
public abstract class BaseTestClass2 : BaseTestClass1
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodA() { }
public void SomeTestMethodB() { }
}
public abstract class BaseTestClass3 : BaseTestClass1
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodX() { }
public void SomeTestMethodY() { }
}
public class TestClass2A : BaseTestClass2
{
public override void BaseTestClass1Method()
{
// do stuff
}
}
public class TestClass2B : BaseTestClass2
{
public override void BaseTestClass1Method()
{
// do same stuff as TestClassA
}
}
public class TestClass3A : BaseTestClass3
{
public override void BaseTestClass1Method()
{
// do stuff
}
}
public class TestClass3B : BaseTestClass3
{
public override void BaseTestClass1Method()
{
// do same stuff as TestClass3A
}
}
}
Run Code Online (Sandbox Code Playgroud)
这时我有上面的结构.扩展另一个基类的基类.基类由两个子类扩展.BaseTestClass1Method
两个子类的实现是相同的.如果有可能从两个父母扩展,我会创建一个扩展BaseTestClass1
实现的类BaseTestClass1Method
.这两个子类将扩展BaseTestClass2
和新类,以便我只需要实现BaseTestClass1Method
一次当我添加另一个BaseTestClass3(与BaseTestClass2相同的级别)从BaseTestClass1扩展并从中创建子类时,我有更多的重复代码用于BasetestClass1Method的实现.如何用正确的模式解决这个问题?
这是一个更实施的例子:
namespace NUnitTestAbstract
{
public interface IServer { }
public abstract class ServerBase
{
public abstract IServer GetServerInstance();
}
public abstract class SomeTests1Base : ServerBase
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodA() { }
public void SomeTestMethodB() { }
}
public abstract class SomeTests2Base : ServerBase
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodX() { }
public void SomeTestMethodY() { }
}
public class TestClass2A : SomeTests1Base
{
public override IServer GetServerInstance()
{
IServer serverX = null;
return serverX;
}
}
public class TestClass2B : SomeTests1Base
{
public override IServer GetServerInstance()
{
IServer serverX = null;
return serverX;
}
}
public class TestClass3A : SomeTests2Base
{
public override IServer GetServerInstance()
{
IServer serverY = null;
return serverY;
}
}
public class TestClass3B : SomeTests2Base
{
public override IServer GetServerInstance()
{
IServer serverY = null;
return serverY;
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于Diamond问题,不支持从两个类(或抽象类)派生.D
调用父方法时的类型实例- 如何知道哪个父类?
而不是具有许多抽象类的深度继承树使用接口和组合.
您的逻辑是通过某个接口定义的,并且具有针对该特定逻辑的不同具体类型.然后类似的类TestClassb
可以创建所需逻辑的实例,或者更好的仍然依赖于它的构造函数:
public class Derived
{
public Derived(ILogic someDependentLogic) { }
}
Run Code Online (Sandbox Code Playgroud)
在您的代码注释中,您说它TestClass2B
具有相同的行为,TestClassA
但它取而代之BaseTestClass2
.您应该正确考虑继承树.应该TestClass2B
是一种类型BaseTestClass2
?或者它应该是一种类型TestClassA
?如果它实际上是"那种",TestClassA
那么继承它.
总之答案是特定的域名,但我建议你阅读成分:它会帮助你了解什么样的关系,你有什么是适合自己情况的正确的设计.
另外也有一些很好的设计模式来看待,如State
,Strategry
,Decorator
下dofactory
看到的后发优势Composition
以及何时使用它,你可以看看SOLID
和Inversion Of Control
这将有助于这一切很好地配合在一起.