2010-03-21 15 views
21

Interfejsy zdefiniowane przez MSDN "zawierają tylko podpisy metod, delegatów lub zdarzeń." Ponieważ jednak właściwości nie są niczym więcej niż syntaktycznym cukrem dla metody get i set, są również dozwolone w interfejsach. Moje pytanie brzmi - czy jest jakaś sytuacja, w której właściwe jest definiowanie właściwości w interfejsie, czy powinniśmy trzymać się scenariuszy opisanych przez MSDN?Czy interfejsy powinny definiować właściwości?

Odpowiedz

31

Myślę, że właściwości są całkowicie dopuszczalne w interfejsach.

Tak jak powiedziałeś, tak naprawdę są to metody get, set lub get i set. Wiele interfejsów w Framework definiują właściwości, takie jak IAsyncResult i IWebProxy.

+0

Dziękuję, Reed. W takim przypadku, czy te właściwości powinny mieć charakter podstawowy (nieokreślony przez użytkownika)? Powodem, dla którego pytam, jest to, że jeśli na przykład zdefiniujesz go jako typ domeny, możesz otrzymać odwołanie cykliczne. –

+1

@ Otávio Décio: Należy pamiętać o celu interfejsu. Interfejs definiuje kontrakt. Jeśli nieruchomość jest wymagana do umowy, to jest w porządku. Nie powinieneś kończyć się odwołaniami cyklicznymi, ponieważ właściwości nie powinny być typami bezpośrednio implementującymi interfejs, ale raczej podstawowymi typami struktury lub typami, które same stanowią część "umowy". IWebProxy (link powyżej) jest dobrym przykładem - ma właściwość Credentials, która jest z ICredentials. Jest to część umowy, ale niezbędny jest typ "zdefiniowany przez użytkownika" (dla tej biblioteki). –

+1

tylko po to, aby upewnić się, że właściwości zdefiniowane w interfejsach powinny być nieokreślonymi przez użytkownika typami betonu lub typami interfejsów (zdefiniowanymi przez użytkownika lub nie). –

13

artykuł, który odwołuje się do stwierdza również:

interfejs może być członkiem nazw lub klasy i może zawierać podpisy następujących Członków:

  • Metody
  • Właściwości
  • Indexery
  • Wydarzenia
+0

@Simon: tak, teraz widzę. –

3

Tak, interfejs powinien określić właściwości, gdy jest to naprawdę w potrzebie. Przypuśćmy to. Istnieje interfejs użytkownika IUser, który zdefiniował właściwość "Nazwa", a następnie można z niego korzystać bez obaw o to, czy obiekt nie zaimplementował tej właściwości.

public void main() 
{ 
    IUser u = User.GetUser("id"); 
    string name = u.Name; 
} 
Powiązane problemy