6

申し訳ありませんが、質問のファンキーなタイトルを取得できませんでした。

.Net(C#) はMultiple Inheritanceをサポートしていないと教えられていました。しかし、以下の foo の例を見ると、これは本当に真実なのだろうか??

class fooList
{
    public int Index()
    {
        return 0;
    }
}    
class foo : fooList
{
    public foo()
    { }
}
class testFoo
{
    void test()
    {
        foo obj = new foo();

        // From object
        obj.Equals(obj);
        obj.GetHashCode();
        obj.GetType();
        obj.ToString();

        // From fooList
        obj.Index();
    }
}

fooListクラスと、ことわざに従ってfoo継承するクラスがあることがわかるように(C#は多重継承をサポートしていません)、クラスのオブジェクトには、クラスからのメソッドが1つだけある必要がありますが、オブジェクトからのメソッドがさらにありますクラス。デフォルトでは、すべてのクラスがクラスを継承することを明確に示しています。それで疑問が生じますfooListfooIndex()fooListobject

  1. C# が Multiple Inheritance をサポートしていないというのは本当に完全に本当ですか?
  2. CLRレベルでサポートしていると思いますが、コーディングでサポートしていないのはなぜですか?
4

5 に答える 5

4

多重継承は、ここに表示されているものではありません。多重継承とは、クラスが 2 つの基本クラスから「並行して」派生することを意味します。たとえば、次のようになります。

public class Test : Base1, Base2 {}

それは不可能です。

ここに表示されているのは (これはどのオブジェクト指向言語でも機能します)、もちろん、クラス A は階層全体からメソッドとプロパティを継承するということです。

例えば:

public class Test : Base {}

が から直接派生している場合、はBaseおよびからすべてのメソッドを継承します。ObjectBaseObject

したがって、この階層がある場合:

public class Base : Object {}
public class A : Base {}

Baseは からすべてのメソッドとプロパティを継承しObject、からすべてのメソッドとプロパティを継承し、したがって からもA継承します。BaseObject

そうしないと、クラス階層を構築できません。

于 2013-05-27T06:39:07.913 に答える
1

多重継承ではなく、多重ラベル継承の例を示しています。

多重継承とは、1 つのクラスが複数のクラスを継承できることを意味します。

class A: B,C

c# の場合は正しくありません

于 2013-05-27T06:41:28.770 に答える
0

Index() メソッドとは別に、他のメソッドはすべての参照型と値型の基本クラスである Object クラスからのものです。C# が多重継承を許可していないことは事実ですが、多重継承はサポートしています。C# は、インターフェイスを使用している場合、多重継承をサポートしています。

C# は、2 つの基本クラスに同じメソッドが定義されている場合に発生する可能性があるあいまいさを取り除くための多重継承をサポートしておらず、メソッドのどのバージョンが呼び出されるかコードを見て混乱する可能性があります。このリンクをチェックしてください。

この不確実性は、次の例に示すように 2 つのインターフェイスを使用することで取り除くことができます。

public  interface IA
{
  string SomeMethod();
}

public interface IB
{
  string SomeMethod();
}

class MyConcreteClass:IA, IB
{
  string IA.SomeMethod()
  {
     return "For IA";       
  }

  string IB.SomeMethod()
  {
     return "For IB";       
  }
}

IA concA = new MyConcreteClass();
IB concB = new MyConcreteClass();

 Console.WriteLine(concA.SomeMethod()); // print "For IA"
 Console.WriteLine(concB.SomeMethod()); // print "For IB"

ご覧のとおり、あいまいさを防ぐ派生クラスで明示的に定義することにより、両方のインターフェイスの関数に異なる動作を持たせることができます。

ここで注意すべきもう 1 つの点は、派生型のインスタンスからアクセスできないため、派生クラスの関数定義をパブリックにできないことです。

于 2013-05-27T07:16:00.737 に答える