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

[注意:AlphaModelBetaModel仅包含一些纯字段]

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

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

最佳答案

因此,您基本上将描述与“所需”体系结构相矛盾。

此外,请始终记住,您不会基于结果来决定体系结构(“是否可以将AlphaModel变成接口”):您的决定基于需求和责任。

介面

认为这是各阶层都同意的合同。他们没有任何实现,只描述了该类实现的一个合同

抽象类

他们是...班。因此,他们没有定义合同,而是定义了行为。大多数情况下,在定义抽象类时,您正在寻找想要子类继承和/或赋予其含义的抽象行为。

你的问题

您说的是某些类必须从AlphaModel继承,而另一些类则不能从AlphaModel继承。

因此,您是在说:


某个类BetaModel1AlphaModel继承,并引入了一些新的成员功能。
另一个类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!!!
    }

10-06 14:36