我有一个名为BetaModel
的抽象模型,它继承了它的父AlphaModel
。然后
我有一堆继承BetaModel
的请求模型,因此自然会继承AlphaModel
,但我还有其他一组响应模型必须继承BetaModel
和的字段不要需要AlphaModel
中的字段。
[注意:AlphaModel
和BetaModel
只包含一些普通字段]
让响应模型继承BetModel
但忽略AlphaModel
的优雅方法是什么?
是否可以将AlphaModel
变成一个接口,以便它只在所有请求模型中实现,而不是在响应模型中实现?
答案 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
的相同成员/功能换句话说,您所说的所有大写字母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!!!
}