【发布时间】:2020-07-01 13:03:40
【问题描述】:
问题是:如何同时提供多重继承(C# 不允许)和默认方法实现(C#
一般情况是,我有第一个抽象层,然后是第二个抽象层,生成两个不同的系列/类别,最后是属于上述两个系列/类别的东西的具体实现。
我写的示例代码如下(但请不要过多关注实现细节,仅将其视为描述性场景):
public abstract class Message
{
protected Guid _id;
protected string _body;
protected Message(string body)
{
_body = body;
}
public override string ToString()
{
return _id + "|" + _body;
}
}
public abstract class ReceivableMessage : Message
{
private string _receivedFrom;
public ReceivableMessage(string body, string receivedFrom)
: base(body)
{
_receivedFrom = receivedFrom;
}
public string GenerateReply()
{
//do some generation
return "";
}
}
public abstract class SendableMessage : Message
{
private string _sendTo;
public SendableMessage(string body, string sendTo)
: base(body)
{
_sendTo = sendTo;
}
public bool CheckReply(ReceivableMessage reply)
{
//do some check
return true;
}
}
那么我有几个ReceivableMessage 和SendableMessage 的具体实现;但现在我想添加具体类AckMessage 和NackMessage...它们应该同时扩展ReceivableMessage 和SendableMessage(因为两者都可以接收和发送)...我怎样才能做到这一点?
作为额外的 cmets,我考虑了两种可能性,但放弃了它们:
- 用 3 个接口替换 3 个抽象类。不行,因为我会丢失公共方法实现
ToString、GenerateReply和CheckReply,我应该在所有具体类以及公共字段_id、_body、_receivedFrom中重复它们和_sendTo(即使从技术上讲这可以避免用属性替换它们)。 - 提供
AckReceivableMessage和NackReceivableMessage(继承自ReceivableMessage)以及AckSendableMessage和NackSendableMessage(继承自SendableMessage)的具体实现。不行,这在我看来是代码重复。
【问题讨论】:
-
C# 中没有多重继承,即使在 8 中也是如此。DIM 不提供多重继承,也不能替代抽象类
-
@PanagiotisKanavos 我知道 8.0 版中没有多重继承 (C# 不允许)(我没有指定任何版本,因此不适用于所有版本)。关于 DIM achronim,我很抱歉,但我不知道您指的是什么。
-
你为什么首先考虑继承?继承不是代码重用机制。你有一堆消息。你想以同样的方式对待其中一些人吗?一个或多个接口将是一个好主意。扩展方法可以为每个接口提供额外的功能。
-
该功能是默认接口成员(因此是 DIM),而不是默认方法实现
-
I know there is no multiple inheritance in version 8.0您仍然考虑使用默认接口成员作为实现多重继承的一种方式。这就是它的用途。通过这种方式,这将是一种实现特征的方法,只能通过接口本身访问。对于消费者来说,这类似于在接口上使用扩展方法
标签: c# interface abstract-class multiple-inheritance