11

この機能を実装することは可能ですか? 2 つの抽象クラスがあり、3 番目のクラスに強制的に 2 つのクラスのすべての抽象メソッドを実装させたい

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のメソッドをオーバーライドして、新しく作成されたクラスの動作を外部から変更できます。
-スコープ内で作成しながら、クラスが異なるスコープを作成できます。
-ファクトリを介してミックスインされたオブジェクトを作成する必要があります(新しいMyObject()は、ありがたいことに、ミックスインを考慮しません)。

于 2012-10-02T16:46:18.327 に答える
2

.NET Core 3.0 上の C# 8.0 以降、C# は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)
    // {
    // }
}
于 2020-05-19T07:19:22.007 に答える
1

代わりに複数のインターフェースを使用してみましたか?これは同様の状況である可能性があります: 複数の派生抽象クラス?

于 2012-10-02T16:33:22.667 に答える
1

具体的には?いいえ、C#では多重継承はサポートされていないためです。

最も近いものは、他の2つを組み合わせたインターフェースを使用することです。

public interface ISomeInterfaceA
{
    int Prop { get; }
}

public interface ISomeInterfaceB
{
    void SomeMethod();
}

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB
{

}

次に、タイプの引数を要求できますがICombined、これでは目的の引数が完全には得られません。たとえば、これを行う場合:

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

結合されたインターフェースを明示的に実装しなかったので、これは適格ではありません。それが構成されている2つのインターフェースだけです。

于 2012-10-02T16:34:11.913 に答える
0

最終クラスに機能を実装する場合は、インターフェイスを作成して、必要な数だけ実装できます...

于 2012-10-02T16:34:16.080 に答える