【问题标题】:.net Multiple inheritance from abstract classes.net 抽象类的多重继承
【发布时间】:2012-10-02 16:30:16
【问题描述】:

可以实现这个功能吗? 我有两个抽象类,我想强制 第三个类实现两个类中的所有抽象方法

public abstract class A
{
    private void MethodA()
    {
        var fool = Prop*2;
    }
    public abstract int Prop { get; }
}
public abstract class B
{
    private void MethodB()
    {
        //.... 
        SomeMethod();
        //....
    }
    public abstract void SomeMethod();
}

public class C: A, B
{
    public int Prop { .... }
    public void SomeMethod { .... }
}

这里的主要问题是实现的最终类方法然后在基本抽象类中使用,而这不能通过接口来实现。所以没有解决办法?

我已经阅读了许多类似的问答,但没有任何回应我的问题。 谢谢

【问题讨论】:

标签: .net abstract-class multiple-inheritance


【解决方案1】:

不,C# 不支持多重继承。您可以实现多个接口,但这显然不一样,因为接口不能实现任何具体行为。

【讨论】:

  • 这里的主要问题是实现的最终类方法然后在基抽象类中使用,而这不能用接口来实现。所以没有变通办法?
  • @Michele Virgilio:恐怕简短的回答是除了你的类的新设计之外没有其他解决方法。
【解决方案2】:

您可以通过 Mixins 在 C# 中执行此操作,它的实现方式与多重继承不同,但最终您会得到一个包含多个类的所有方法的对象。

这不是语言的特性,但可以在第三方中找到。

您可以在my answer to this other question 或直接在re-mix's codeplex 上阅读有关它的信息

几个兴趣点:
- 您可以覆盖 Mixin 中的方法,从而在外部修改新创建的类的行为。
- 您可以创建在范围内创建时类不同的范围。
- 您需要通过工厂创建混合对象(谢天谢地,new MyObject() 不会考虑混合)。

【讨论】:

    【解决方案3】:

    从 .NET Core 3.0 上的 C# 8.0 开始,C# 支持 default implementations for Interface members

    public interface ILight
    {
        void SwitchOn();
        void SwitchOff();
        bool IsOn();
    }
    
    // Basic Implementation
    public class OverheadLight : ILight
    {
        private bool isOn;
        public bool IsOn() => isOn;
        public void SwitchOff() => isOn = false;
        public void SwitchOn() => isOn = true;
    
        public override string ToString() => $"The light is {(isOn ? "on" : "off")}";
    }
    
    // Interface with default implementation
    public interface ITimerLight : ILight
    {
        // defines default implementation
        public async Task TurnOnFor(int duration)
        {
            Console.WriteLine("Using the default interface method for the ITimerLight.TurnOnFor.");
            SwitchOn();
            await Task.Delay(duration);
            SwitchOff();
            Console.WriteLine("Completed ITimerLight.TurnOnFor sequence.");
        }
    }
    
    // Implementation with interface
    public class OverheadLight : ITimerLight
    {
        private bool isOn;
        public bool IsOn() => isOn;
        public void SwitchOff() => isOn = false;
        public void SwitchOn() => isOn = true;
    
        public override string ToString() => $"The light is {(isOn ? "on" : "off")}";
    
        // Automatically gets the interface implementation
        //
        // To provide your own implementation: (no use of override)
        // public async Task TurnOnFor(int duration)
        // {
        // }
    }
    

    【讨论】:

      【解决方案4】:

      您是否尝试过使用多个接口?这可能是类似的情况: Multiple derived abstract classes?

      【讨论】:

        【解决方案5】:

        具体来说?不,因为 C# 不支持多重继承。

        你能得到的最接近的方法是使用结合了其他两个的界面:

        public interface ISomeInterfaceA
        {
            int Prop { get; }
        }
        
        public interface ISomeInterfaceB
        {
            void SomeMethod();
        }
        
        public interface ICombined : ISomeInterfaceA, ISomeInterfaceB
        {
        
        }
        

        然后您可能需要ICombined 类型的参数,但这并不能完全满足您的需求。例如,如果我要这样做:

        public class A : ISomeInterfaceA, ISomeInterfaceB
        {
          ...
        }
        

        这不符合条件,因为我没有显式实现组合接口,只是它所组成的两个接口。

        【讨论】:

          【解决方案6】:

          如果您愿意在最终类中实现功能,您可以创建接口并实现任意数量...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-05
            • 2013-06-10
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 2010-10-23
            • 1970-01-01
            • 2019-04-30
            相关资源
            最近更新 更多