W języku C # następujący kod jest poprawny
interface I{
int property{get;set;}
}
To nie ma dla mnie żadnego sensu. Wydaje się to łamać jedną z najważniejszych zasad interfejsów: brak stanu (innymi słowy brak pól). Czy właściwość nie tworzy niejawnego pola prywatnego? Czy to nie byłoby naprawdę złe dla interfejsów?
c#
interfaces
properties
Przywróć Monikę
źródło
źródło
Odpowiedzi:
Myślę, że mylące jest to, że jeśli piszesz
int Property { get; set; }
wewnątrz klasy, jest to właściwość automatyczna z niejawnym polem zaplecza.Ale jeśli napiszesz dokładnie to samo w interfejsie, to nie jest to właściwość automatyczna , po prostu deklaruje, że właściwość jest częścią interfejsu i że każdy typ implementujący interfejs musi zawierać tę właściwość (jako auto-właściwość lub nie ), ale nie tworzy pola podkładu.
Jednym ze sposobów dostrzeżenia różnicy jest napisanie
int Property { get; }
: jest to poprawne w interfejsie i deklaruje właściwość, która ma tylko moduł pobierający, ale nie ustawiający. Ale nie skompiluje się w klasie (chyba że używasz C # 6.0), ponieważ auto-właściwość musi mieć setter.źródło
Definiowanie właściwości tak, jak pokazano, jest takie samo, jak definiowanie metod
int GetProperty()
ivoid SetProperty(int i)
. Właściwości są potężnym skrótem w C #.Właściwość nie tworzy domyślnie pola prywatnego w języku C #. To jest realizacja niewypłacalności
auto-property
, na przykładpublic string MyString { get; set;}
- jednak właściwość, która określa niestandardową logikę wget
metodzie nie wygeneruje niejawny pole prywatny.Wreszcie, ponieważ interfejsy dotyczą publicznego interfejsu API, jakie znaczenie miałoby, gdyby implementacja właściwości interfejsu opierała się na polu prywatnym - domyślnym lub innym? To jest ukryte przed konsumentami interfejsu niezależnie.
źródło
Właściwości to metody! Do klasy, która implementuje interfejs, zostanie dodane pole zaplecza (ręcznie lub poprzez auto-właściwość).
źródło