c#继承多个父母

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)

Gil*_*een 6

由于Diamond问题,不支持从两个类(或抽象类)派生.D调用父方法时的类型实例- 如何知道哪个父类?

在此输入图像描述

而不是具有许多抽象类的深度继承树使用接口和组合.

  • 用于定义API的接口
  • 通过特定实现的组合.

您的逻辑是通过某个接口定义的,并且具有针对该特定逻辑的不同具体类型.然后类似的类TestClassb可以创建所需逻辑的实例,或者更好的仍然依赖于它的构造函数:

public class Derived 
{
    public Derived(ILogic someDependentLogic) { }
}
Run Code Online (Sandbox Code Playgroud)

在您的代码注释中,您说它TestClass2B具有相同的行为,TestClassA但它取而代之BaseTestClass2.您应该正确考虑继承树.应该TestClass2B是一种类型BaseTestClass2?或者它应该是一种类型TestClassA?如果它实际上是"那种",TestClassA那么继承它.

总之答案是特定的域名,但我建议你阅读成分:它会帮助你了解什么样的关系,你有什么是适合自己情况的正确的设计.

  1. 构成与继承
  2. 喜欢构成而不是继承?
  3. 继承与构成的区别

另外也有一些很好的设计模式来看待,如State,Strategry,Decoratordofactory

看到的后发优势Composition以及何时使用它,你可以看看SOLIDInversion Of Control这将有助于这一切很好地配合在一起.