I odore un odore di codice qui. È mia opinione che dovresti ereditare solo una classe base se stai implementando tutte le funzionalità di quella classe base. Quello che stai facendo non rappresenta in modo appropriato i principi orientati agli oggetti. Quindi, se vuoi ereditare dalla tua base, dovresti implementare il Nome, altrimenti hai la tua eredità nel modo sbagliato. La tua classe A dovrebbe essere la tua classe base e la tua attuale classe base dovrebbe ereditare da A se è quello che vuoi, non viceversa.
Tuttavia, non allontanarsi troppo dalla domanda diretta. Se fatto vuole a non rispettare "le regole" e vuole continuare sulla strada che avete scelto - ecco come si può andare a questo proposito:
La convenzione è quello di implementare la proprietà, ma gettare un NotImplementedException quando la proprietà si chiama - anche se non mi piace neanche quello. Ma questa è la mia opinione personale e non cambia il fatto che questa convenzione sia ancora valida.
Se si sta tentando di obsoleta la proprietà (ed è dichiarato nella classe di base come virtuale), allora si potrebbe usare sia l'attributo obsoleto su di esso:
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(Edit: Come Brian sottolineato nei commenti, il secondo parametro dell'attributo causerà un errore del compilatore se qualcuno fa riferimento alla proprietà Name, quindi non sarà in grado di utilizzarlo anche se lo hai implementato nella classe derivata.
Oppure, come ho detto, usa NotImplementedException:
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Tuttavia, se la proprietà non è dichiarata come virtuale, quindi è possibile utilizzare la nuova parola chiave per sostituirlo:
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
È comunque possibile utilizzare l'attributo obsoleto nello stesso modo come se il metodo è stato sovrascritto oppure puoi lanciare NotImplementedException, a seconda di quale si sceglie. Io probabilmente usare:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
o:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
A seconda se o non è stata dichiarata come virtuale nella classe base.
Questa è una violazione di uno dei principi di base della programmazione orientata agli oggetti (il polimorfismo e, relazione a ciò, il 'L' in solido). – jason
In particolare una violazione del principio di sostituzione di Liskov (http://en.wikipedia.org/wiki/Liskov_substitution_principle) –
Molte delle risposte ignorare il semplice fatto che una classe base può essere fornito da una terza parte. Poiché questo codice non è di proprietà, non può essere modificato. C'è una certa validità nel voler creare una versione più focalizzata della classe base nascondendo i membri. Ed è preferibile ereditare piuttosto che usare il controllo di base come componente di un nuovo controllo in quanto richiede un sacco di lavoro extra nell'esporre i metodi già trovati nella base. – Mario