1

重複の可能性:
C#での多重継承

C#はクラスでの多重継承をサポートしていないことを私は知っています。

ただし、 MyClassにClassAとClassBの両方の機能を追加する必要があります。

public class ClassA
{
    /* Third party class*/
}
public class ClassB
{
    /* Third party class*/
}

public class MyClass : ClassA, ClassB
{
    /*Compilation error*/
}

これを達成する方法はありますか?

4

5 に答える 5

8

C#では、複数のインターフェイスの継承のみを行うことができます。これらのサードパーティクラスでできる最善のことは、それぞれのインスタンスをカプセル化し、MyClass各関数呼び出しを再作成して、適切なインスタンスに渡すことです。

public class MyClass
{
    ClassA a = new ClassA();
    ClassB b = new ClassB();

    void AMethod()
    {
       a.AMethod();
    }

    int BMethod(int value)
    {
      return b.BMethod(value);
    }
}

たとえば、が必要な場所でこのクラスを使用できるようにする必要がある場合ClassAは、変換演算子を追加して、ClassAまたはに変換し直すことができますClassB。その時点で、これらの新しいインスタンスを返すか、内部インスタンスを公開する方が適切かどうかは、慎重に検討する必要があります。

もちろん、インターフェースを実装する場合、ClassAまたは実装する場合ClassB 、新しいクラスにもそれらを実装することをお勧めします。

しかし、結局のところ、C#には複数の実装継承がありません。そのようなものが必要な場合(これはまれです)、C#は適切な言語ではありません。これはCLRの制限であり、特にC#の制限ではないため、他のCLR言語も同様です。

于 2013-01-11T08:35:24.090 に答える
7

変更できない場合は、これらのクラスのサブタイプを作成してから集計することをお勧めしますClassAClassB

//third party
class ClassA
{
    void X();
}
class ClassB
{
    void Y();
}
//your code
interface IClassA
{
    void X();
}
interface IClassB
{
    void Y();
}

class MyClassA : ClassA, IClassA { }
class MyClassB : ClassB, IClassB { }

class MyClass : IClassA, IClassB
{
    IClassA a = new MyClassA();
    IClassB b = new MyClassB();
    public void X()
    {
        a.X();
    }

    public void Y()
    {
        b.Y();
    }
}
于 2013-01-11T08:39:59.327 に答える
1

いいえ、複数のクラスから継承することはできません。複数のインターフェースの継承のみが許可されます。代わりに構成を使用することを検討してください。

public class MyClass : ClassA, IClassB
{
    private IClassB _classB; // delegate IClassB implementation to it

    public MyClass(IClassB classB)
    {
       _classB = classB;
    }

    public void BMethod()
    {
        _classB.BMethod();
    }
}
于 2013-01-11T08:35:09.200 に答える
1

アクセスしたいすべてのメソッドを含むClassAおよびClassB(それぞれIClassAおよびIClassBと呼ばれる)のインターフェースを作成します。

次に、そのインターフェイスをClassAとClassBに実装します。

最後に、MyClassにIClassAとIClassBを実装させます。

public class MyClass : IClassA, IClassB
{
}
于 2013-01-11T08:35:30.017 に答える
0

ClassAのインターフェイスを生成しClassB、の2つのインターフェイスから継承することができます。MyClass

于 2013-01-11T08:34:52.003 に答える