2009-03-08 12 views
16

Szukam "rozszerzenia" interfejsu poprzez zapewnienie dostępu do zestawu właściwości w tym interfejsie. Interfejs wygląda mniej więcej tak:Dodaj "zestaw" do właściwości interfejsu w C#

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

chcę coś takiego:

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

muszę dziedziczenia. Nie mogę skopiować treści IUser do IMutableUser i dodać zestawu akcesoriów.

Czy to możliwe w języku C#? Jeśli tak, jak można to osiągnąć?

Odpowiedz

12

Nie widzę żadnego powodu, dlaczego, co zostało zamieszczone nie powinni pracować? Właśnie wykonałem szybki test i wszystko się zgadza, ale ostrzega przed ukrywaniem. Można to naprawić, dodając nowe słowo kluczowe, takie jak to:

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

Alternatywą byłoby dodanie jawnie ustalonych metod; np .:

public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

Oczywiście, wolałbym użyć seterów, ale jeśli to niemożliwe, myślę, że robisz to, co musisz.

+0

Dodawanie nowych działało świetnie! Dzięki! Czy możesz zaktualizować swoją odpowiedź na przykładzie (dla innych)? – strager

+0

Z praktycznego punktu widzenia: interfejsy ewoluują bardzo źle w miarę upływu czasu. Wszyscy implementatorzy interfejsu zerwą z każdą zmianą w tej umowie .... –

+0

@PatrickPeters - Zakładam, że komentarz został skierowany na metodę SetUserName? Nie widzę problemów z pierwszą opcją. Niektóre z możliwych przerw są eliminowane, jeśli implementator w razie potrzeby zastosuje wyraźną implementację. – Maslow

8

Można użyć klasy abstrakcyjnej:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

Inną możliwością jest, aby w ten sposób:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

Potrzebuję MutableUser do odziedziczenia IUser. Zajrzę do pierwszej metody. – strager

+0

Korzystanie z klasy abstrakcyjnej działa. Jednak nie wydaje się to najbardziej eleganckim rozwiązaniem. Zostawię to pytanie nieco otwarte na ewentualne "lepsze" odpowiedzi. – strager

7

Możesz "przesłonić" właściwości w interfejsie, jawnie implementując interfejsy. Odpowiedź Chrisa najprawdopodobniej będzie potrzebna do scenariusza, który opisałeś, ale rozważ nieco bardziej złożony scenariusz, w którym potrzebujesz klasy getter/setter, ale interfejs definiuje tylko getter. Można obejść ten problem w następujący sposób:

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

jawnie wykonawczych IUser.MyProperty, spełniasz umowy. Jednakże, dostarczając publicznie MyProperty, API dla twojego obiektu nigdy nie będzie pokazywać jawnej wersji interfejsu i zawsze użyje MyProperty z get/set.

Powiązane problemy