C#7.0-使用默认实现实现多重继承

问题描述 投票:1回答:1

问题是:如何同时提供多重继承(C#不允许)和默认方法实现(C#<8.0中的接口不允许)?

一般情况是,当我有第一个抽象层,然后是第二个抽象层时,生成两个不同的族/类,最后是同时属于上述族/类的事物的具体实现。

我编写的示例代码如下(但请不要过多地关注实现细节,仅将其视为描述性场景):

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;
    }
}

然后我有ReceivableMessageSendableMessage的几个具体实现;但是现在我想添加具体的类AckMessageNackMessage ...它们应该同时扩展ReceivableMessageSendableMessage(因为两者都可以接收和发送)...如何实现呢?作为其他评论,我考虑了两种可能性,但将其丢弃:

  1. 用3个接口替换3个抽象类。不好,因为我会丢失通用方法实现ToStringGenerateReplyCheckReply,因此我应该在所有具体类以及通用字段_id_body_receivedFrom中重复它们和_sendTo(即使从技术上讲,也可以避免使用属性替换它们)。
  2. AckReceivableMessageNackReceivableMessage(从ReceivableMessage继承)以及AckSendableMessageNackSendableMessage(从SendableMessage继承)提供具体实现。不好,在我看来这是代码重复。
c# interface abstract-class multiple-inheritance
1个回答
0
投票

我通过使用动态分派创建了多个继承。这是完成大规模定制系统属性的一种过于复杂的方法。您根本上想要的是能够集成来自多个模块的处理能力。制造架构允许容器以两种方式无限增长-这些术语来自业务-]

  • 垂直:扩展过程(而不是子类化来完成)
  • 横向:添加新进程(而不是继承或继承)
  • 多重继承的另一个问题是它引入了歧义。尚不清楚当两个类都继承时应调用哪种方法。

    class A
    {
        public void One() { ... }
    }
    class B
    {
        public void One() { ... }
    }

但是,诸如大规模定制之类的制造体系结构将过程建模为整个类,而不仅仅是方法,因此,上述问题可以通过名称空间来避免。

namespace A
{
    class OneProduct { ... }
    class One : Producer<OneProduct>, IProcess { ... }
}

namespace B
{
    class OneProduct { ... }
    class One : Producer<OneProduct>, IProcess { ... }
}

// example of a hardcoded process
namespace IntegratingProcess
{
    class MyProduct { ... }
    class MyProcess : Producer<OneProduct>, IProcess 
    {
        private A.One Machine1 { get; set; }
        private B.One Machine2 { get; set; }
        void D() { // allocate memory for all machines and product DTO }
        void O() { // binds Machine1 and Machine2 to MyProduct reference properties }
        void M()
        {
            Machine1.M();
            Machine2.M();
        }
    }

}

批量定制允许您动态

集成处理并更改触发顺序。当然,这是上述硬编码形式的替代方法,在硬编码形式中,生产过程及其触发顺序是在编译时构建的。我的R文章涵盖了大规模定制,但我没有为此放弃源代码。

我是POWER的开发人员,制造架构和有效运用它的规则。我的文章指导程序员如何正确使用源代码对协作工作进行建模。

http://www.powersemantics.com/power.html

© www.soinside.com 2019 - 2024. All rights reserved.