2012-05-24 4 views
31

위에서 설명한 것처럼 C#의 Object에서 상속하는 것이 중복됩니까? 아래의 두 코드 집합 모두 동일한 개체가 정의되어 있습니까?C#에서 Object를 상속하는 중복?

class TestClassUno : Object 
{ 
    // Stuff 
} 

class TestClassDos 
{ 
    // Stuff 
} 

나는 MSDN에 주위 스누핑하지만 완벽 결정적인 아무것도 찾을 수 없습니다.

+13

모든 클래스 정의에이 다른 문서를 참조하십시오. –

답변

33

에 객체로부터 상속 중복 말한다.

누군가가 다른 네임 스페이스에 다른 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

예, 또는 structs에 의해 또한'object'에서 상속됩니다. 그러나 요점은'.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

관련 문제