2012-05-24 31 views
31

Như đã nêu ở trên, có thừa kế thừa kế từ Object trong C# không? Cả hai bộ mã dưới đây có dẫn đến các đối tượng tương đương được xác định không?Dự phòng kế thừa từ Object trong C#?

class TestClassUno : Object 
{ 
    // Stuff 
} 

vs

class TestClassDos 
{ 
    // Stuff 
} 

tôi snooped xung quanh trên MSDN nhưng đã không thể tìm thấy bất cứ điều gì một cách hoàn hảo thuyết phục.

+13

Bất kỳ định nghĩa lớp nào không chỉ định rõ ràng một lớp cơ sở sẽ thừa kế từ 'đối tượng'. –

Trả lời

33

Nếu trái không xác định mỗi class định nghĩa ngầm sẽ kế thừa từ System.Object do đó hai định nghĩa là tương đương.

Thời gian duy nhất này sẽ khác nhau nếu ai đó thực sự xác định loại Object khác trong cùng một không gian tên. Trong trường hợp này định nghĩa địa phương của Object sẽ được ưu tiên và thay đổi các đối tượng thừa kế

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

Rất nhiều trường hợp góc nhưng sẽ không chỉ nó ra nếu tôi không nhìn thấy nó trước khi

Lưu ý rằng điều này cũng không đúng nếu bạn sử dụng object thay vì Object. Từ khóa C# object là bí danh loại cho System.Object và do đó nó sẽ không khớp với Example.Object.

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

Tất nhiên nếu bạn có một nhà phát triển thực sự ác bạn vẫn có thể gây nhầm lẫn với 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

Sẽ không phải địa phương 'Example.Object' vẫn thừa kế từ' System.Object'? – Aren

+1

@Aren 'Object' cục bộ thực sự sẽ nhưng' C' trong trường hợp này sẽ kế thừa từ 'Example.Object' – JaredPar

+0

Cảm ơn bạn đã phản hồi nhanh. Đó chắc chắn không phải là trường hợp mà tôi đã nghĩ đến - cuộc gọi tốt. – Keplah

20

Có, mọi thứ cuối cùng được thừa hưởng từ một đối tượng nếu được xác định là class. Để lại thừa kế rõ ràng trong mã của bạn.

+1

'struct' quá, thực sự. –

+0

@Cicada, Bạn nói đúng. – Aren

+1

@Cicada: 'struct' có nguồn gốc * trực tiếp * từ System.ValueType. Nó cũng xuất phát từ System.Object (tất cả mọi thứ cuối cùng), nhưng các kiểu struct thậm chí không áp dụng cho OP vì chúng chỉ có thể thực hiện các giao diện; một cấu trúc được khai báo như một cấu trúc không bao giờ có thể lấy trực tiếp từ bất cứ thứ gì ngoài ValueType. – KeithS

6

Đối tượng là mẹ của tất cả các lớp trong .Net. Không có gì ở trên nó.

Tất cả các lớp được kế thừa từ đó. Vì vậy, mã này

class TestClassDos 
{ 
    // Stuff 
} 

tự động có nghĩa là nó được kế thừa từ đối tượng.

Bằng chứng: Bạn có thể nhập bất kỳ thực thể nào vào đối tượng có thể nếu nó được kế thừa từ nó.

Tóm tắt các lớp đối tượng nói

// 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

Bạn cũng sẽ tìm thấy' .ToString() 'trong giao diện trong .NET, nhưng giao diện không kế thừa từ 'System.Object'. (Tôi đồng ý với kết luận của bạn, không phải bằng chứng minh bạn cung cấp.) – hvd

+0

@hvd: Nhưng cuối cùng các giao diện sẽ được thực hiện bởi các lớp. –

+1

Có, hoặc theo cấu trúc, cũng được thừa kế từ 'đối tượng'. Nhưng quan điểm của tôi là thực tế là '.ToString()' có sẵn chỉ vì một ngoại lệ đặc biệt trong trình biên dịch cho biết thêm các thành viên 'object' ngay cả đối với một số kiểu không thực sự thừa kế từ' đối tượng'. – hvd

8

Có nó là không cần thiết để kế thừa từ đối tượng trong lớp

7

MSDN: Object class: Hỗ trợ tất cả các lớp trong hệ thống phân cấp lớp .NET Framework và cung cấp dịch vụ ở mức độ thấp đến các lớp học có nguồn gốc. Đây là lớp cơ sở cuối cùng của tất cả các lớp trong Khuôn khổ .NET; nó là gốc của phân cấp kiểu.

Kiểm tra nghiên cứu này: inherits from object? An investigation into how.

enter image description here

2

Vâng, họ đều là những điều tương tự, tôi không nghĩ rằng tôi thấy cấu trúc đề cập đến bất cứ ai, nhưng tất cả các đối tượng (có nghĩa là bất kể nếu bạn khai báo một lớp hoặc một cấu trúc) tất cả họ cuối cùng kế thừa từ Đối tượng, xem điều này Object MSDN article và bài viết khác này trên Structs