不同 children 的 C# 继承倍数

C# inheritance multiple for different children

我有一个名为 BetaModel 的抽象模型继承了它的 parent AlphaModel。然后 我有一堆继承 BetaModel 的请求模型,因此自然会继承 AlphaModel,但是我有其他一堆必须继承 BetaModel 和 [=30 字段的响应模型=]不需要 AlphaModel.

中的字段

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

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

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

如果这只是关于数据的,那么让每个数据部分成为一个接口,例如...

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; }
}

编辑

当然,如果接口在逻辑上绑定在一起,您可以让接口拥有多个成员。

所以,您的描述基本上与 "desired" 架构相矛盾。

此外,请始终记住,您不会根据结果来决定架构 ("Is it OK to turn the AlphaModel becomes an Interface"):您的决定是基于需求和责任。

接口

将其视为 classes 同意的合同。他们没有任何实现,仅描述了一份合约 class 实现

摘要类

他们是……类。因此,他们不定义契约,而是定义行为。大多数情况下,在定义抽象 class 时,您正在寻找一种抽象行为,您希望子 class 能够 inherit and/or 赋予意义.

你的问题

您是说一些 class 必须继承自 AlphaModel 而另一些必须 NOT 继承自 AlphaModel.

因此,您是说:

  • 某个 class BetaModel1 继承自 AlphaModel 并引入了一些新的成员功能。
  • 另一个 class BetaModel2 不应该公开任何来自 AlphaModel 的成员(它尖叫它不继承自 AlphaModel)但也引入相同的 members/functionality 共 BetaModel1

换句话说,你是在用大写字母表示 BetaModel1BetaModel2 DO NOT INHERITY FROM THE SAME CLASS AlphaModel.

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

所以,"enforcing of implementation" 基本上是说 "I want this class to NECESSARILY provide certain functionality"。好吧...你需要 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?";
        }
    }

classes 的用法如下:

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!!!
    }