不同 children 的 C# 继承倍数
C# inheritance multiple for different children
我有一个名为 BetaModel
的抽象模型继承了它的 parent AlphaModel
。然后
我有一堆继承 BetaModel
的请求模型,因此自然会继承 AlphaModel
,但是我有其他一堆必须继承 BetaModel
和 [=30 字段的响应模型=]不需要 AlphaModel
.
中的字段
[注意:AlphaModel
和BetaModel
只包含一些普通字段]
让响应模型继承 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
换句话说,你是在用大写字母表示 BetaModel1
和 BetaModel2
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!!!
}
我有一个名为 BetaModel
的抽象模型继承了它的 parent AlphaModel
。然后
我有一堆继承 BetaModel
的请求模型,因此自然会继承 AlphaModel
,但是我有其他一堆必须继承 BetaModel
和 [=30 字段的响应模型=]不需要 AlphaModel
.
[注意:AlphaModel
和BetaModel
只包含一些普通字段]
让响应模型继承 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
换句话说,你是在用大写字母表示 BetaModel1
和 BetaModel2
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!!!
}