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
}
}
}
目前,我具有上述构造。一个基类扩展了另一个基类。基类由两个子类扩展。
BaseTestClass1Method
的实现对于两个子类是相同的。如果可以从两个父级进行扩展,我将创建一个扩展BaseTestClass1
的类,以实现BaseTestClass1Method
。然后,这两个子类将扩展BaseTestClass2
和新类,这样我只需实现一次BaseTestClass1Method
当我添加从BaseTestClass1扩展的另一个BaseTestClass3(与BaseTestClass2相同的级别)并从中创建子类时,我有更多重复的代码用于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;
}
}
}
最佳答案
您可以在BaseTestClass2中实现BaseTestClass1Method,以便TestClassA和TestClassB获得相同的实现。但是,根据您的要求,走此路径可能会以继承地狱结束。
除了可以从BaseTestClass1继承BaseTestClass2之外,您还可以通过其构造函数将实现BaseTestClass1的实例传递给BaseTestClass2(依赖注入(DI))。然后在TestClassA和TestClassB中,只需调用实例中注入的BaseTestClass1Method方法即可。这会将您的继承级别降低到仅1。
使用DI容器(例如Autofac或Unity)将正确的BaseTestClass1注入到BaseTestClass2的后代中。
更新
所以从你的例子
namespace NUnitTestAbstract
{
public interface IServer { }
public class BaseServer()
{
private IServer _server;
public BaseServer(IServer server)
{
_server = server;
}
public IServer GetServerInstance()
{
return _server;
}
}
public class SomeTests1 : ServerBase
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodA() { }
public void SomeTestMethodB() { }
}
public class SomeTests2 : ServerBase
{
// not overriding BaseTestClass1Method, child classes should do
public void SomeTestMethodX() { }
public void SomeTestMethodY() { }
}
}
public class ServerA : IServer
{
//Implementation
}
public class ServerB : IServer
{
//Implementation
}
var someTests1 = new SomeTests1(new ServerA());
var someTests2 = new SomeTests2(new ServerB());
请注意,我已经删除了抽象类,并将服务器实现注入了新实例。
我删除了TestClass(1..n),因为我看不到它们的需要,但只有您知道答案。
另外,我已经即时编写了此代码,因此尚未对其进行测试,也没有检查它是否可以编译,但是您应该能够掌握它的要旨。希望能帮助到你。
关于c# - C#继承多个 parent ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45096993/