Sono entrato in un dibattito su questa domanda che viene distillata se è una buona idea per una specializzazione di una classe aggiungere regole aziendali. Sfortunatamente questo punto è stato calpestato nei commenti quindi lo sto chiedendo nuovamente come una domanda a parte.
Credo due cose:
- Un oggetto è responsabile della sua coerenza interna
- Una classe di specializzazione / bambino ha regole più specifiche della super classe che può essere vista come il caso generale.
Il risultato logico di ciò è che una specializzazione potrebbe accettare solo alcuni valori di input per il suo metodo o potrebbe modificare alcuni valori per rimanere coerenti. Ma non è OK, dal momento che proteggere la sua coerenza interna è ciò che un oggetto dovrebbe fare?
Un punto che molte persone stavano facendo è che alcuni codici potrebbero rompersi se facessero ipotesi. Ad esempio, l'impostazione della larghezza non cambierebbe l'altezza di un quadrato. Tuttavia non sarebbe un codice cattivo? Dal momento che fai assunzioni su come l'oggetto fa qualcosa invece di dirti cosa fare e non ti preoccupare?
Se non scrivessimo codice come quello, quasi tutto il sovraccarico avrebbe problemi. Con quale frequenza il sovraccarico non aggiunge una condizione di errore extra o più logica interna che potrebbe essere vista attraverso altre parti dell'interfaccia? Forse il punto su cui un ex professore di me ha fatto una volta è corretto: "dovresti usare sempre l'ereditarietà per sovraccaricare il costruttore". All'epoca sembrava un po 'severo, ma ora sembra l'unico modo per garantire che questo tipo di problema non accada mai. Per utilizzare nuovamente il vecchio quadrato: analogia del rettangolo:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height){this.width = width; this.height = height;}
public void SetWidth... SetHeight...
}
public class Square : Rectangle
{
public Square(int diameter) : base(diameter, diameter) {}
public void SetDiameter...
}
Nota: Spero che possiamo svolgere questa domanda un po 'meno "sull'uomo" della domanda che l'ha ispirata. Sono stato su Stack Exchange per più di tre anni ma ero abbastanza intimidito dal tipo di risposte qui.