Poiché gli oggetti vengono creati dal meno derivato al più derivato, quindi devono essere eliminati dal più derivato al meno derivato.
La classe derivante conosce la classe base, ma la classe base non conosce la classe derivata. Se si eliminasse l'oggetto dalla classe meno derivata alla classe più derivata, la classe base rimuoverà le cose che la classe derivata potrebbe aver bisogno nel processo.
Si consideri per esempio che la classe base ha un elenco di oggetti:
public class MyBase {
public List<SomeObject> list;
public MyBase(){
list = new List<SomeObject>();
list.Add(new SomeObject());
list.Add(new SomeObject());
list.Add(new SomeObject());
}
~MyBase() {
foreach (SomeObject obj in list) {
obj.Cleanup();
}
list.Clear();
}
}
La classe derivata aggiunge qualcosa ad ogni elemento della lista:
public class MyDerived : MyBase {
public MyDerived() {
foreach (SomeObject obj in list) {
obj.SomeProperty = new Handler();
}
}
~MyDerived(){
foreach (SomeObject obj in list) {
obj.SomeProperty.Cleanup();
}
}
}
Quando l'oggetto viene abbattuto, la classe derivata ha bisogno di accedere all'elenco per ripulire ciò che ha aggiunto. Se la classe base è stata prima distrutta, la classe derivata non avrebbe accesso agli oggetti nell'elenco.
(Si noti, tuttavia, che IDisposable
normalmente è una scelta migliore per gestire la pulitura controllata di oggetti.)
Immagina di essere dissasembling una grande struttura. Si inizia dalle parti più piccole e si va su –
grazie Dimitar. Ciao Cuong, grazie per aver migliorato la mia domanda :-) –