我有一个名为BetaModel
的抽象模型,该模型继承了其父AlphaModel
。然后
我有一堆继承BetaModel
并因此自然继承AlphaModel
的请求模型,但是我有一堆响应模型必须继承BetaModel
的字段并且不需要AlphaModel
中的字段。
[注意:AlphaModel
和BetaModel
仅包含一些纯字段]
使响应模型继承BetModel
但忽略AlphaModel
的优雅方法是什么?
是否可以将AlphaModel
变成一个接口,以便仅在所有请求模型中实现而不在响应模型中实现?
最佳答案
因此,您基本上将描述与“所需”体系结构相矛盾。
此外,请始终记住,您不会基于结果来决定体系结构(“是否可以将AlphaModel变成接口”):您的决定基于需求和责任。
介面
认为这是各阶层都同意的合同。他们没有任何实现,只描述了该类实现的一个合同
抽象类
他们是...班。因此,他们没有定义合同,而是定义了行为。大多数情况下,在定义抽象类时,您正在寻找想要子类继承和/或赋予其含义的抽象行为。
你的问题
您说的是某些类必须从AlphaModel
继承,而另一些类则不能从AlphaModel
继承。
因此,您是在说:
某个类BetaModel1
从AlphaModel
继承,并引入了一些新的成员功能。
另一个类BetaModel2
不应公开AlphaModel
的任何成员(这表明它不是从AlphaModel
继承的),但还应引入与BetaModel1
相同的成员/功能。
换句话说,您使用的所有大写字母表示BetaModel1
和BetaModel2
不要继承相同的类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!!!
}