2009-09-08 36 views
5

Theo định nghĩa:C# - Sở hữu rõ

"Là giao diện không phải là một đối tượng bằng cách riêng của mình, tôi không thể khởi tạo giao diện it.If được phép tuyên bố fileds, sau đó nó cần vị trí lưu trữ , vì vậy chúng tôi không thể khai báo các trường bên trong giao diện. "

Trong trường hợp tài sản nói ví dụ

khi tôi tuyên bố

string SayHello { get; set; } 

bên trong giao diện

Nó được nội nối như get_SayHello() ,set_SayHello() trong IL (khi tôi tháo rời i có thể thấy phương thức get và set).

Câu hỏi của tôi vẫn là tài sản cần một số vị trí lưu trữ, thì làm sao việc kê khai tài sản

được phép vào bên trong giao diện.

Edit: Đây là những gì tôi understood.As Tôi mới đến C#, tôi đang tìm kiếm sự giúp đỡ của bạn.

Trả lời

13

Bạn đang hoạt động trên một giả định hơi bị lỗi, thuộc tính đó yêu cầu trường sao lưu. Có hầu hết các thuộc tính sử dụng trường hậu thuẫn nhưng điều này chắc chắn không phải là yêu cầu. Tôi có thể ví dụ như thực hiện giao diện của bạn không có lĩnh vực ủng hộ như sau

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter, quan tâm để đưa ra lý do? – JaredPar

+0

Có lẽ cạnh tranh. – Skurmedel

+0

Rõ ràng là bây giờ.Thanks – user160677

6

Việc kê khai của một tài sản trong một giao diện nói rằng bất kỳ lớp thực hiện phải có phương pháp như vậy (get_SayHelloset_SayHello nhưng định nghĩa là tài sản) nhưng không xác định cách chúng được triển khai. Đó là, giao diện nói những gì bạn có thể làm, nhưng bây giờ làm thế nào nó được thực hiện (vì vậy bạn có thể nhận được SayHello "chuỗi", và bạn có thể thiết lập các SayHello "chuỗi"). Vì vậy, để cụ thể: việc xác định thuộc tính trong giao diện không nói gì về các trường sao lưu.

Ngoài ra, quan niệm sai lầm là thuộc tính phải có trường sao lưu. Nội dung sau không:

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

Thuộc tính chỉ là các phương thức có thể truy cập thông qua cú pháp giống trường. Vì chúng là các phương thức và không phải là các trường, chúng có thể định nghĩa một giao diện.

2

Câu hỏi của tôi vẫn là tài sản cần một số vị trí lưu trữ

Đó không phải là sự thật. Bạn có thể làm bất cứ điều gì bạn muốn trong getters/setters. Bằng cách khai báo một thuộc tính trong một giao diện, bạn chỉ cần ép buộc các nhà triển khai cung cấp một trình khởi tạo và/hoặc một trình thiết lập.

1

Một khai báo bên trong một giao diện chỉ cho bạn biết những gì các thành viên có thể được mong đợi tồn tại trên một thể hiện của giao diện đó. Nó cho bạn biết không có gì về cách chúng được thực hiện hoặc nơi chúng được lưu.

Tôi nghĩ bạn đã nhầm lẫn khái niệm về giao diện với giao diện của lớp. Bạn không khởi tạo các giao diện, nhưng các lớp thực hiện chúng.

4

Như Jared nói, tài sản không nhất thiết cần bất kỳ vị trí lưu trữ nào ... nhưng bạn vẫn đang nghĩ đến nó.

Hãy tưởng tượng giao diện của bạn đã thực sự:

public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

phương pháp Chỉ trong một giao diện. Bạn có hài lòng với điều đó không? Nếu vậy, đó thực sự là tất cả tài sản, cùng với một chút siêu dữ liệu để buộc các phương thức đó lại với nhau. Không có gì để làm với các lĩnh vực ... chỉ là phương pháp.

Trình triển khai có thể muốn sử dụng một trường nhưng hoàn toàn tách biệt với giao diện.

3

Tuyên bố thuộc tính như vậy trong một giao diện đơn giản có nghĩa là bất kỳ lớp nào bạn xác định thực hiện giao diện đều được yêu cầu để triển khai thuộc tính đó. Các lớp đó được tự do triển khai thuộc tính theo bất kỳ cách nào bạn thấy phù hợp (hoặc là thuộc tính tự động, hoặc thông qua một số phương tiện phức tạp khác).

Thay đổi sở hữu của bạn trong giao diện như sau:

string SayHello { get; } 

Các lớp thực hiện được chỉ cần thiết để thực hiện các getter cho tài sản đó. Nhưng không có phân bổ lưu trữ đang diễn ra ở cấp độ giao diện.

2

Không phải tất cả ngôn ngữ .NET đều có khái niệm về thuộc tính. Vì vậy, các giao diện cũng phải xác định các phiên bản get_ và set_ của thuộc tính để bất kỳ ngôn ngữ .NET nào cũng có thể sử dụng kiểu này. Điều này có thể làm tăng thêm sự nhầm lẫn của bạn.

+0

Làm thế nào một ngôn ngữ không có khái niệm về một thuộc tính, vì có một thuộc tính đọc/ghi trong .net là (alas) khác nhau về ngữ nghĩa khi có thuộc tính chỉ đọc và cũng có ghi chỉ tài sản? Ví dụ, với 'IReadableFoo', với thuộc tính chỉ đọc' Foo', và 'IWritableFoo', với một thuộc tính chỉ có tên ghi, một giao diện' IReadWriteFoo' thừa hưởng cả hai phải, hữu ích, xác định đọc thứ ba -tiết kiệm tài sản. Làm thế nào người ta có thể làm điều đó trong một ngôn ngữ mà không hiểu thuộc tính? – supercat

+0

@supercat: Tôi không thấy cách liên quan đến câu trả lời (khủng khiếp) này (mà tôi sẽ xóa sớm) hoặc câu hỏi. Câu hỏi của bạn được trả lời một phần bởi "Tuân thủ CLS", và một phần bởi "bạn đang hút thuốc địa ngục?". – Will

+0

Nếu một ngôn ngữ không biết về các thuộc tính, có cách nào mà nó có thể được sử dụng để viết một triển khai của một giao diện có chứa một giao diện không? – supercat

Các vấn đề liên quan