2013-05-27 23 views
5

申し訳ありませんが、質問のファンキーなタイトルを取得していません。複数の継承とオブジェクトC#

私は、.NET(C#)はサポートしていません。複数継承。しかし、下の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とことわざに応じfooListを継承するクラスfooを持っていることを見ることができるように(C#は多重継承をサポートしていません)クラスfooのオブジェクトがIndex()ある唯一の方法を持っている必要がありますfooListクラスからですが、オブジェクトクラスのメソッドが増えています。これは、デフォルトですべてのクラスがobjectクラスを継承することを明確に示しています。だから質問が発生する

  1. C#が複数をサポートしていないということは本当に本当ですか? 継承?
  2. CLRレベルでサポートしていると思いますが、なぜそれがサポートされていないのですか? コーディングでは?
+1

これは多重継承のケースではありません。すべてのクラスは、特に指定がなければオブジェクトから継承します。別のクラスから直接継承すると、そのクラスがオブジェクトから継承するので、間接的にオブジェクトから継承します。オブジェクトはすべてのオブジェクトのルートです。 – Andreas

+1

'class fooList'は' class fooList:object'の省略形です。それはあなたの混乱を解消するはずです。 – user1096188

答えて

13

C#では、単一レベルで複数のクラスの継承をサポートしていません。 C#は階層内の複数のレベルの継承をサポートしています。あなたが見ているのは、継承階層の最上部にあるSystem.Objectで、これは.NETのクラスと構造体のトップレベルの基本クラスです。

あなたが持つことができないです。

class A { } 
class B { } 
class C : A, B { } 

を持つことができます。

class A { } 
class B : A { } 
class C : B { } 

メイクセンスを?

もう少し完全であれば、C#ではをシミュレートすることができます。複数の継承をインターフェイスを使用して実行できます。だからそれを戻ってみましょう。この例では

class A { } 
interface B { } 
class C : A, B { } // legal 

、C の宣言は合法である、とあなたはC.

+0

+1インターフェイスを指し示すために+1。 –

4

多重継承の一部は、あなたがしているものではないとして、インタフェースBを定義し、様々なメンバーを実装する必要がありますここを見てください。複数の継承とは、あるクラスが2つの基本クラスから「並列」で派生したことを意味します。

public class Test : Base1, Base2 {} 

これは不可能です。

あなたがここに見ているのは、オブジェクト指向言語でも同じですが、もちろんクラスAはすべての階層全体からメソッドとプロパティを継承しています。例えば

Base直接Object由来する場合

public class Test : Base {} 

は、BaseObjectからすべてのメソッドを継承します。

あなたはこの階層を持っているのであれば:

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

BaseObjectからのすべてのメソッドとプロパティを継承し、ABaseので、またObjectからのすべてのメソッドとプロパティを継承します。

それ以外の場合、クラス階層を構築することはできません。

1

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

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

1

のC#の場合には当てはまりません

class A: B,C 

。クラスは既に別のクラスを継承しているクラスを継承できます。しかし、クラスは同時に2つ以上の異なるクラスを継承することはできません。

// Default inheritance from Object. 
// Class A inherits System.Object 
class A  

// Simple inheritance. This is not multiple inheritance. 
// Class B inherits class A, which inherits Object 
class B : A  

// Simple inheritance. This is not multiple inheritance. 
// Class C inherits class B, which inherits class A, which inherits Object 
class C : B 

// Default inheritance from Object. 
// Class D inherits System.Object 
class D  

// Multiple inheritance 
// Class E inherits both class A and class D 
class E : A, D 

// Multiple inheritance 
// Class F inherits both class A and class B 
class F : A, B 

// Multiple inheritance 
// Class G inherits both class C and class D 
class G : C, D 
0

他のメソッドは、すべての参照型および値型の基本クラスであるObjectクラスのものです。 C#では多重継承はできませんが、マルチレベル継承をサポートしていることは事実ですが、Interfacesを使用している場合はC#で多重継承をサポートしています。

C#では、2つの基本クラスに同じメソッドが定義されている場合に発生する可能性のあるあいまいさを除去するための多重継承はサポートされていません。このlinkをチェックしてください。

この不確実性は、下の例に示すように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" 

あなたは私たちが明示的あいまいさから妨げるような派生クラスでそれらを定義することによって、インタフェースの両方の機能のために異なる動作を持つことができます見ることができるように。

ここで留意すべき点は、派生クラスの関数定義は、派生型のインスタンスによってアクセスできないため、パブリックにすることができないことです。