2012-05-24 4 views
31

上記のとおり、C#のObjectから継承するのは冗長ですか? 以下の両方のコードセットで同等のオブジェクトが定義されていますか?C#でオブジェクトから継承する冗長?

class TestClassUno : Object 
{ 
    // Stuff 
} 

class TestClassDos 
{ 
    // Stuff 
} 

私はMSDNに周りの詮索が、完全に決定的な何かを見つけることができませんでした。

+13

任意のクラス定義上、この他の記事を参照してください。 –

答えて

33

内のオブジェクトから継承する冗長であると言います。

これらの2つの唯一の時間は、誰かが実際に同じ名前空間に別のObjectタイプを定義した場合です。この場合、Objectのローカル定義が優先して変更する非常に多くの継承オブジェクト

namespace Example { 
    class Object { } 
    class C : Object { } 
} 

コーナーケースを私は

注意する前にそれを見ていない場合は、それを指摘しないだろうということObjectの代わりにobjectを使用した場合も同じです。 C#キーワードobjectSystem.Objectのタイプエイリアスであるため、Example.Objectと一致しません。もちろん

namespace Example2 { 
    class Object { } 
    class C : Object { } // Uses Example.Object 
    class D : object { } // Uses System.Object 
} 

あなたが本当に邪悪な開発者を持っている場合、あなたはまだobject

namespace System { 
    class Object { 
    private Object() { } 
    } 
} 

namespace Example3 { 
    // This will properly fail to compile since it can't bind to the private 
    // Object constructor. This demonstrates that we are using our definition 
    // of Object instead of mscorlib's 
    class C : object { } // Uses our System.Object 
} 
+7

ローカルの 'Example.Object'はまだ' System.Object'から継承していませんか? – Aren

+1

@Arenローカルの 'Object'は本当にそうですが、この場合' C'は 'Example.Object'から継承します。 – JaredPar

+0

素早い応答をありがとう。それは確かに私が考えていたケースではありません - 良い呼び出し。 – Keplah

20

はい、最終的にオブジェクトはすべてclassと定義されていればオブジェクトを継承します。明示的な継承をコードの外にしておきます。

+1

'struct'も実際にはあります。 –

+0

@Cicada、あなたは正しいです。 – Aren

+1

@Cicada: 'struct'は、System.ValueTypeから直接*を派生します。 System.Objectからも派生していますが(最終的にはすべてです)、構造体の型はインターフェイスにしか実装できないため、OPには適用されません。構造体として宣言された構造体は、ValueType以外のものから直接派生することはできません。 – KeithS

6

オブジェクトは.Netのすべてのクラスの母です。それ以上に何もありません。

すべてのクラスは、それを継承します。したがってこのコード

class TestClassDos 
{ 
    // Stuff 
} 

は自動的にオブジェクトから継承することを意味します。

証明書:継承している可能性のあるオブジェクトをオブジェクトに型キャストすることができます。 Objectクラスの

まとめ

// Supports all classes in the .NET Framework class hierarchy and provides low-level 
// services to derived classes. This is the ultimate base class of all classes 
// in the .NET Framework; it is the root of the type hierarchy. 
+0

.NETのインタフェースでは' .ToString()それでもインタフェースは 'System.Object'から継承しません。 (私はあなたの結論に同意します、あなたが与える証拠ではありません) – hvd

+0

@hvd:しかし最終的にはインタフェースはクラスによって実装されます。 –

+1

はい、またはstructによっても継承されます。しかし、私の主張は、 '.ToString()'が利用可能であるという事実は、 'object'から実際に継承されないいくつかの型に対しても' object'のメンバを加えるコンパイラの特別な例外のためです。 – hvd

8

は、はい、左に指定されていないすべてのclass定義は暗黙のうちに二つの定義が等価であるので、System.Objectから継承する場合、クラス

7

MSDNとの混同を引き起こす可能性があります:Object class:.NET Frameworkクラス階層内のすべてのクラスをサポートし、低レベルのサービスを提供しています派生クラスに。これは、.NET Frameworkのすべてのクラスの究極の基本クラスです。これは型階層の根です。

チェックこの研究:inherits from object? An investigation into how.

enter image description here

2

はい、彼らは両方とも同じものです、私は誰もが構造体に言及見たとは思わないが、すべてのオブジェクト(クラスを宣言する場合にはかかわらず、ですまたは、それらすべてが最終的にオブジェクトから継承する構造体)は、このObject MSDN articleと明示的に `が暗黙のうちにobject`から継承する基本クラスを指定していないStructs

関連する問題