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/

10-12 22:19