Ponieważ obiekty są budowane od najmniej do najbardziej pochodzi pochodzi, więc muszą być rozebrany z najbardziej pochodzący z lEst pochodzi.
Klasa wyprowadzenie wie o klasie bazowej, ale klasa bazowa nie wiedzieć o klasie pochodnej. Jeśli chcesz zburzyć obiekt z najmniej pochodnej klasy do najbardziej pochodnej klasy, klasa podstawowa usunie rzeczy, które klasa pochodna może potrzebować w procesie.
Rozważmy na przykład, że klasa bazowa posiada listę obiektów:
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();
}
}
Klasa pochodna dodaje coś do każdej pozycji na liście:
public class MyDerived : MyBase {
public MyDerived() {
foreach (SomeObject obj in list) {
obj.SomeProperty = new Handler();
}
}
~MyDerived(){
foreach (SomeObject obj in list) {
obj.SomeProperty.Cleanup();
}
}
}
Kiedy obiekt zostanie rozebrany, klasa pochodna potrzebuje dostępu do listy, aby wyczyścić to, co zostało dodane. Jeśli klasa bazowa została najpierw zniszczona, klasa pochodna nie będzie miała dostępu do obiektów na liście.
(Należy jednak pamiętać, że IDisposable
jest zazwyczaj lepszym rozwiązaniem do obsługi kontrolowane oczyszczanie obiektów.)
Wyobraź sobie, że dissasembling dużą strukturę. Zaczynasz od mniejszych części i podchodzisz do góry –
dziękuję Dimitar. Cuong Cześć, dziękuję za poprawę moje pytanie :-) –