2009-03-08 11 views
16

Sto cercando di "estendere" un'interfaccia fornendo accessors alle proprietà in quell'interfaccia. L'interfaccia simile a questa:Aggiungi 'set' alle proprietà dell'interfaccia in C#

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

voglio qualcosa di simile:

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

Ho bisogno della ereditarietà. Non riesco a copiare il corpo di IUser in IMutableUser e aggiungere i set di accessori.

È possibile in C#? Se è così, come può essere realizzato?

risposta

12

non vedo alcuna ragione per cui ciò che hai postato non dovrebbe funzionare? Ho appena fatto un rapido test e compila bene, ma dà un avvertimento sul nascondiglio. Questo può essere risolto aggiungendo la nuova parola chiave, in questo modo:

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

Un'alternativa sarebbe quella di aggiungere metodi set espliciti; ad esempio:

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

Naturalmente, io preferisco usare setter, ma se non è possibile, credo che fare quello che devi.

+0

Aggiunta di nuovi funzionanti alla grande! Grazie! Puoi aggiornare la tua risposta con un esempio (per gli altri)? – strager

+0

Dal punto di vista pratico: le interfacce si evolvono molto male nel tempo. Tutti gli implementatori dell'interfaccia si romperanno ad ogni modifica di questo contratto .... –

+0

@PatrickPeters - Presumo che il commento sia stato diretto al metodo SetUserName? Non vedo problemi con la prima opzione. Alcune delle possibili interruzioni vengono eliminate se l'implementatore segue un'implementazione esplicita dove appropriato. – Maslow

8

Si potrebbe utilizzare una classe astratta:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

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

Un'altra possibilità è quella di avere questo:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

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

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

Ho bisogno di MutableUser per ereditare IUser. Esaminerò il primo metodo – strager

+0

Utilizzo di una classe astratta funziona. Tuttavia, non sembra essere la soluzione più elegante qui. Lasciamo questa domanda aperta per un po 'per possibili risposte "migliori". – strager

7

È possibile "sovrascrivere" le proprietà in un'interfaccia implementando esplicitamente le interfacce. La risposta di Chris è probabilmente tutto ciò di cui hai bisogno per lo scenario che hai delineato, ma considera uno scenario leggermente più complesso, in cui hai bisogno di un getter/setter sulla tua classe, ma l'interfaccia definisce solo il getter. È possibile aggirare il problema nel modo seguente:

public class MyUser : IUser 
{ 

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

    public MyProperty { get; set; } 

} 

Implementando esplicitamente IUser.MyProperty, si soddisfano il contratto. Tuttavia, fornendo pubblico MyProperty, l'API per il tuo oggetto non mostrerà mai la versione dell'interfaccia esplicita e utilizzerà sempre MyProperty con get/set.

Problemi correlati