dziedziczenie, wyjatki...

0

mam dwa pytania, jedno odnosnie dziedziczenia a drugie wyjatkow ale postanowilem zalozyc jeden temat:

pierwsze:
czy w delphi dziedziczy sie konstruktory? czy konstruktor moze byc wirtualny?
pytania biora sie z tego iz w c++ tego nie ma:) a tu wydaje mi sie ze jest.
taki przyklad:

chce dynamicznie <ort>twozyc </ort>forme, IDE nie generuje ciala konstruktora wiec dodaje go sobie do klasy:

interface:
...
constructor Create(owner: TComponent);

implementation
...
constructor klasa.Create(owner: TComponent);
begin
inherited Create(owner);
...
end;

dostaje ostrzezenie i przyslaniam wirtualany konstruktor z klasy bazowej. dodanie override przy deklaracji likwiduje ostrzezenie.
jaki jest sens virtualnych konstruktorow?

drugie pytanie dotyczy wyjatkow:
zakladajac iz mamy w klasie akrybuty bedace obiektami innych klas badz wskazniki.
konstruktor wyglada tak:
...
begin
obiekt_klasy := Klasa.Create;
//tu instrukcje ktora generuje wyjatek
end;

finalnie obiekt nie zostaje <ort>utwozony </ort>a w miejsu <ort>twozenie </ort>obiektu mozemy przechwycic wyjatek, ale co z naszym "obiekt_klasy"?

w c++ robi sie tak:

{
obiekt_klasy = new Klasa();
try
{
//tu moze byc wyjatek
}
catch(const Exception& e)
{
// tu lapiemy
delete obiekt_klasy; // zwalniamy i wyjatek przekazujemy dalej
throw;
}
}

i spokojnie lapiemy <ort>sobei </ort>wyjatek w miejscu <ort>twozenia </ort>naszego <ort>obeiktu </ort>a "obiekt _klasy" jest zwolniony.

czy w delphi jest jakis mechanizm pozwalajacy zlapac wyjatek i przekazac go dalej?
finally odpada bo w przypadku nie wystapienia <ort>wyjateku </ort>"obiek_klasy" ma byc zniszczony w destruktorze.

w c++ mozemy <ort>stwozyc </ort>wlasna klase wyjatku ktora oprocz komuniaktu moze zawierac <ort>jakeis </ort>dane, liczby idt istotne dla odpowiedniego postepowania.
czy w delphi jest taka mozliwosc?
w bloku except z tego co wiem mozna jedynie wywolac raise i otrzymamy komunikat wyjatku ale do <ort>samgo </ort>obiektu wyjatku nie ma dostepu wiec takie <ort>twozenie </ort>inteligentniejszych wyjatkow mijaloby sie z celem choc mam nadzieje iz nie mam racji:).

try
...
except
on xxx do
//tu chce zwolnic pamiec i wyjatek puscic dalej z tym samym komunikatem. da sie? jesli nie to jak rozwiazac ten problem?

0

Reraising wyjątku w Delphi:

try
  //sth
except
  foo.Free();
  raise;
end;

Dostęp do obiektu wyjątku jest:

//w bloku except
on E: EDivByZero do //co robimy jak dzielenie przez zero, E to obiekt wyjątku
on E: Exception do //co robimy jak jakiś inny wyjątek, E to obiekt wyjątku
0
banita21 napisał(a)

czy w delphi dziedziczy sie konstruktory?
tak

czy konstruktor moze byc wirtualny?
tak

taki przyklad:

chce dynamicznie twozyc forme, IDE nie generuje ciala konstruktora wiec dodaje go sobie do klasy:

interface:
...
constructor Create(owner: TComponent);

implementation
...
constructor klasa.Create(owner: TComponent);
begin
inherited Create(owner);
...
end;

dostaje ostrzezenie i przyslaniam wirtualany konstruktor z klasy bazowej. dodanie override przy deklaracji likwiduje ostrzezenie.
no bo zasłaniasz konstruktor klasy bazowej. Nie jest to błąd a kompilator Cię ostrzega. Jeśli chcesz przesłonić metodę (konstruktor) bazowy to dodaj na końcu reintroduce i po sprawie

jaki jest sens virtualnych konstruktorow?
dokładnie taki sam jak wszystkich innych wirtualnych metod

drugie pytanie dotyczy wyjatkow:
zakladajac iz mamy w klasie akrybuty bedace obiektami innych klas badz wskazniki.
konstruktor wyglada tak:
...
begin
obiekt_klasy := Klasa.Create;
//tu instrukcje ktora generuje wyjatek
end;

finalnie obiekt nie zostaje utwozony a w miejsu twozenie obiektu mozemy przechwycic wyjatek, ale co z naszym "obiekt_klasy"?

w c++ robi sie tak:

{
obiekt_klasy = new Klasa();
try
{
//tu moze byc wyjatek
}
catch(const Exception& e)
{
// tu lapiemy
delete obiekt_klasy; // zwalniamy i wyjatek przekazujemy dalej
throw;
}
}

i spokojnie lapiemy sobei wyjatek w miejscu twozenia naszego obeiktu a "obiekt _klasy" jest zwolniony.

czy w delphi jest jakis mechanizm pozwalajacy zlapac wyjatek i przekazac go dalej?
finally odpada bo w przypadku nie wystapienia wyjateku "obiek_klasy" ma byc zniszczony w destruktorze.

w c++ mozemy stwozyc wlasna klase wyjatku ktora oprocz komuniaktu moze zawierac jakeis dane, liczby idt istotne dla odpowiedniego postepowania.
czy w delphi jest taka mozliwosc?
w bloku except z tego co wiem mozna jedynie wywolac raise i otrzymamy komunikat wyjatku ale do samgo obiektu wyjatku nie ma dostepu wiec takie twozenie inteligentniejszych wyjatkow mijaloby sie z celem choc mam nadzieje iz nie mam racji:).

try
...
except
on xxx do
//tu chce zwolnic pamiec i wyjatek puscic dalej z tym samym komunikatem. da sie? jesli nie to jak rozwiazac ten problem?

begin
  obiekt_klasy := Klasa.Create;
  try
    //tu instrukcje ktora generuje wyjatek
  except
    obiekt_klasy.Free;
  end;
end;

KLASA, KTÓRA ZAKŁADA MOŻLIWOŚĆ WYRZUCENIA WYJĄTKU W KONSTRUKTORZE JEST ŹLE ZAPROJEKTOWANA!!!

0

thx o to mi chodzilo. w sumie jest to oczywiste ze raise powinno propagowac wyjetak dalej ale zmylil mi tekst z kompendium a mianowicie:

Pozostawienie słowa raise samego, jak w poniższym przypadku, spowoduje wyświetlenie domyślnego komunikatu o błędzie:

try
{ jakieś funkcje }
except
raise;
end;

z czego wynika iz zadnej propagacji nie ma.

pytanie pierwsze nadal aktualne.

0

no to to co chcesz zrobić wygląda tak

begin
  obiekt_klasy := Klasa.Create;
  try
    //tu instrukcje ktora generuje wyjatek
  except
    obiekt_klasy.Free;
    raise;
  end;
end;

ale napiszę jeszcze raz wyraźnie

<font size="4">KLASA, KTÓRA ZAKŁADA MOŻLIWOŚĆ WYRZUCENIA WYJĄTKU W KONSTRUKTORZE JEST ŹLE ZAPROJEKTOWANA!!!</span>

0

Misiekd

moglbys podac mi najprostszy przyklad zastosowania konstruktora virtualnego?
z racji iz w delphi instancja klasy nie moze byc obiektem (konstruktor kopiujacy wiec odpada) nie moge doszukac sie sensownego zastosowania.

i jeszcze takie pytanie:
czy to dziedziczenie konstruktorow polega tylko i wylaczenie na tym iz mozna w konstruktorze klasy pochodnej wywolac konstruktor klasy bazowej czy na czyms jeszcze?

co do klasy ktora podczas konstrukcji instancji generuje wyjatek to nie wiedze nic zlego.
zalozenia programowania obiektowego odnosnie wyjatkow(gdzie nie powinno ich byc) dotycza operacji destrykcji, przypisania i podmiany. moze zbyt staram sie przeniesc myslenie z c++ na delphi...

0
banita21 napisał(a)

Misiekd

moglbys podac mi najprostszy przyklad zastosowania konstruktora virtualnego?
z racji iz w delphi instancja klasy nie moze byc obiektem (konstruktor kopiujacy wiec odpada) nie moge doszukac sie sensownego zastosowania.

Zdaje się TObject ma wirtualny konstruktor i destruktor. Musisz sobie zobaczyć.

czy to dziedziczenie konstruktorow polega tylko i wylaczenie na tym iz mozna w konstruktorze klasy pochodnej wywolac konstruktor klasy bazowej czy na czyms jeszcze?

Tylko na tym.

co do klasy ktora podczas konstrukcji instancji generuje wyjatek to nie wiedze nic zlego.
zalozenia programowania obiektowego odnosnie wyjatkow(gdzie nie powinno ich byc) dotycza operacji destrykcji, przypisania i podmiany. moze zbyt staram sie przeniesc myslenie z c++ na delphi...

Hmmm, no generalnie chodzi o to, że:

obiekt := TMojSuperZajeObiekt.Create;

nigdy się nie powinno wywalić. Chyba, że nie masz wystarczająco pamięci albo coś w ten deseń. No wiadomo. Ale tworzenie obiektu zawsze powinno zakończyć się pomyślnie. Wszędzie o tym piszą. Przynajmniej ja się spotkałem z tym kilka już razy w różnych artykułach i na różnych stronach.

0
Juhas napisał(a)
banita21 napisał(a)

Misiekd

moglbys podac mi najprostszy przyklad zastosowania konstruktora virtualnego?
z racji iz w delphi instancja klasy nie moze byc obiektem (konstruktor kopiujacy wiec odpada) nie moge doszukac sie sensownego zastosowania.

Zdaje się TObject ma wirtualny konstruktor i destruktor. Musisz sobie zobaczyć.

no dobrze ale jakie to ma zastosowanie w praktyce? jaka role spelnia ten wirtualny konstruktor?
jesli mozna to bardzo prosze o malutki fragment kodu gdzie wykozystuje sie wlasciwosci metod wirtualnych w tym wypadku konstruktora bo sam nie potrafie sobie wyobrazic takiej sytuacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1