C#继承多个不同的孩子

时间:2017-05-04 04:36:36

标签: c# inheritance parent-child abstract

我有一个名为BetaModel的抽象模型,它继承了它的父AlphaModel。然后 我有一堆继承BetaModel的请求模型,因此自然会继承AlphaModel,但我还有其他一组响应模型必须继承BetaModel的字段不要需要AlphaModel中的字段。

[注意:AlphaModelBetaModel只包含一些普通字段]

让响应模型继承BetModel但忽略AlphaModel的优雅方法是什么?

是否可以将AlphaModel变成一个接口,以便它只在所有请求模型中实现,而不是在响应模型中实现?

2 个答案:

答案 0 :(得分:0)

如果只是关于数据,那么每个数据空间都是一个像......这样的接口。

public interface IAlphaModel
{
    string SomeField { get; set; }
}

public interface IBetaModel
{
    int AnotherField { get; set; }
}

public interface ISomeRequest : IAlphaModel, IBetaModel
{
    bool YetAnotherField { get; set; }

}

class SomeRequest : ISomeRequest
{
    public string SomeField { get; set; }
    public int AnotherField { get; set; }
    public bool YetAnotherField { get; set; }
}

public interface IAnotherRequest : IBetaModel
{
    long TheUltimateField { get; set; }

}

class AnotherRequest : IAnotherRequest
{
    public int AnotherField { get; set; }
    public long TheUltimateField { get; set; }
}

修改

当然,如果它们在逻辑上捆绑在一起,你可以让接口有多个成员。

答案 1 :(得分:0)

因此,您基本上与“期望”架构的描述相矛盾。

此外,请记住,您根本不会根据结果决定架构(“将AlphaModel变为接口是否可行”):您的决策是基于需求和责任。

<强>接口

将其视为课程同意的合同。他们没有任何实现,只是描述了一个类实现

的合同

抽象类

他们是......班级。因此,他们没有定义合同,他们定义行为。大多数情况下,在定义抽象类时,您正在寻找一种抽象行为,您希望子类能够继承和/或赋予其意义。

您的问题

您说某些类必须继承自AlphaModel,而其他一些类必须 NOT 继承自AlphaModel

因此,你这样说:

  • 某个班级BetaModel1继承自AlphaModel,并介绍了一些新成员的功能。
  • 另一个班级BetaModel2不应该公开来自AlphaModel的任何成员(因为它不会从AlphaModel继承而尖叫),但也会引入BetaModel1的相同成员/功能

换句话说,您所说的所有大写字母BetaModel1BetaModel2都不会从同一类AlphaModel中继承。

现在,回到我们的初步讨论。 C#不允许多重继承(看起来像你想要做的)。但是有一些策略可以最大限度地减少重写代码和/或强制执行某些实现。

因此,“实施​​的执行”基本上是说“我希望这个类能够提供某些功能”。嗯......你需要一个interface

<强> C#

    public interface IBetaModel
    {
        string PropertyBeta { get; set; }
        string MethodBeta();
    }

还有AlphaModel

<强> C#

    public class AlphaModel
    {
        public string PropertyAlpha { get; set; }

        public string MethodAlpha()
        {
            return "This is Alpha";
        }
    }

现在,您所需的BetaModel1(如上所述)非常简单地继承自AlphaModel并实施IBetaModel

<强> C#

    public class BetaModel1 : AlphaModel, IBetaModel
    {
        public string PropertyBeta { get; set; }
        public string MethodBeta()
        {
            return "This is Beta?";
        }
    }

BetaModel2它只是实施IBetaModel,在这种情况下:

<强> C#

    public class BetaModel2 : IBetaModel
    {
        public string PropertyBeta { get; set; }
        public string MethodBeta()
        {
            return "This is Beta?";
        }
    }

类的用法如下:

<强> C#

    public void DoStuffWith(IBetaModel betaModel)
    {
        betaModel.PropertyBeta = "WOW, it works";
    }

    public void DoStuff()
    {
        var betaModel1 = new BetaModel1();
        var betaModel2 = new BetaModel2();
        AlphaModel betaModel1_ = new BetaModel1();
        //AlphaModel betaModel2_ = new BetaModel2(); //won't compile

        betaModel1.PropertyAlpha = "Test";
        //betaModel2.PropertyAlpha = "Test"; //won't compile

        DoStuffWith(betaModel1); //great!!!
        DoStuffWith(betaModel2); //great too!!!
    }