11

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

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

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

我已经阅读了许多类似的 q/a 但没有回应我的问题。谢谢

4

6 回答 6

10

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

于 2012-10-02T16:31:29.663 回答
2

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

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

你可以在我对这个其他问题的回答中阅读它,或者直接在re-mix 的 codeplex上阅读

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

于 2012-10-02T16:46:18.327 回答
2

从 .NET Core 3.0 上的 C# 8.0 开始,C# 支持接口成员的默认实现

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)
    // {
    // }
}
于 2020-05-19T07:19:22.007 回答
1

您是否尝试过使用多个接口?这可能是类似的情况: 多个派生抽象类?

于 2012-10-02T16:33:22.667 回答
1

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

您可以获得的最接近的方法是使用结合了其他两个接口的接口:

public interface ISomeInterfaceA
{
    int Prop { get; }
}

public interface ISomeInterfaceB
{
    void SomeMethod();
}

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB
{

}

然后你可能需要 type 的参数ICombined,但这并不能完全得到你想要的。例如,如果我要这样做:

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

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

于 2012-10-02T16:34:11.913 回答
0

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

于 2012-10-02T16:34:16.080 回答