.net来自抽象类的多重继承

时间:2012-10-02 16:30:16

标签: .net abstract-class multiple-inheritance

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

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 { .... }
}

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

我读过许多类似的问答,但没有回应我的问题。 感谢

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

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

这不是该语言的一个特征,但它可以在第三方中找到。

您可以在my answer to this other question或直接在re-mix's codeplex

上阅读相关信息

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

那是具体的吗?不,因为C#不支持多重继承。

你能得到的最接近的是使用一个结合了另外两个界面的界面:

public interface ISomeInterfaceA
{
    int Prop { get; }
}

public interface ISomeInterfaceB
{
    void SomeMethod();
}

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB
{

}

然后你可以要求ICombined类型的参数,但这并不能完全得到你所追求的东西。例如,如果我这样做:

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

这不符合条件,因为我没有明确地实现组合接口,只是由它组成的两个接口。

答案 4 :(得分:1)

从.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)
    // {
    // }
}

答案 5 :(得分:0)

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