可以实现此功能吗? 我有两个抽象类,我想强迫 第三类实现两个类中的所有抽象方法
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类方法然后在基本抽象类中使用,而这不能通过接口实现。所以没有解决方法?
我读过许多类似的问答,但没有回应我的问题。 感谢
答案 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)
你能得到的最接近的是使用一个结合了另外两个界面的界面:
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)
如果您愿意在最终类中实现该功能,您可以创建接口并实现任意多个...