Se il fatto che l'unico modo per farlo è quello di utilizzare la parola chiave new
ti dà fastidio, allora secondo me stai pensando di interfacce sbagliate.
Certo, si potrebbe dire che IInherited
"eredita da" IBase
; ma che cosa significa veramente ? Queste sono interfacce; stabiliscono contratti di codice. Nascondendo la proprietà IBase.Property1
con new string Property1 { get; set; }
, non viene visualizzata alcuna funzionalità. Quindi la ragione tradizionale per cui molti sviluppatori considerano il nascondersi come una cosa "cattiva" - che viola il polimorfismo - è irrilevante in questo caso.
Chiediti: cosa fa davvero quando si tratta di interfacce? Forniscono una garanzia di risposta a determinate chiamate di metodo, giusto?
Quindi, date le seguenti due interfacce:
interface IBase
{
string Property1 { get; }
}
interface IInherited : IBase
{
new string Property1 { set; }
}
- Se un oggetto implementa
IBase
, si può leggere la sua proprietà Property1
.
- Se un oggetto implementa
IInherited
, è possibile leggere la sua proprietà Property1
(proprio come con un'implementazione IBase
) e si può anche scrivere su di esso.
Ancora una volta, non c'è davvero nulla di problematico qui.
fonte
2010-08-18 20:36:02
Penso che qui ci sia confusione tra l'ereditarietà delle classi e l'ereditarietà delle interfacce. Un'interfaccia in realtà non ne eredita un'altra nella stessa era una classe ne eredita un'altra. Tutto il tuo codice dice che IInherited implementa anche IBase. Il codice va bene, solleva solo un avviso del compilatore perché stai cambiando la firma di Property1 nell'interfaccia. Puoi chiarire questo con nuovo. –
Come notato da molti altri, questa sintassi non è possibile, ma credo che dovrebbe essere. Se si utilizza Reflection su Property1, ci sarebbe un metodo Property1_get e un metodo Property1_set, quindi logicamente sembra che sia possibile implementarli separatamente. E la mancanza di essere in grado di farlo sicuramente mi porta a duplicare il codice qualche volta (o sopportare la nuova parola chiave). – cedd