|
8.5 Konvertierung
Ein Objekt einer Klasse kann in ein Objekt einer anderen Klasse derselben Klassenhierarchie
umgewandelt werden. Dieser Vorgang wird als Konvertierung bezeichnet.
Beispiel:
type Kreis is new Punkt.Punkt with record
Radius : Integer;
end record;
type Segment is new Kreis.Kreis with record
Anfangswinkel,
Endewinkel : Integer;
end record;
with Punkt;
procedure Zeichnen ( S: Segment ) is
begin
Text_IO.put_line( "Zeichne Segment " &
" Wi1=" & Integer'Image(S.Anfangswinkel) & "
" &
"Wi2="
& Integer'Image(S.Endewinkel) & " Radius=" &
Integer'Image(S.Radius) & " und " );
-- Weiternutzung von vorhandenen Prozeduren:
Punkt.Zeichnen ( Punkt.Punkt(S) ); -- Konvertierung
!
end; |
Die vorhandene Prozedur zum Zeichnen eines Punktes wird von der Prozedur
zum Zeichnen eines Segmentes weitergenutzt. Durch die Schreibweise "Punkt(S)"
wird eine Typ-Konvertierung durchgeführt, die zur Folge hat, daß
der Prozeduraufruf "Zeichnen" die Prozedur "Zeichnen"
der Klasse "Punkt" aufruft. Ohne diese Konvertierung würde
die Prozedur "Zeichnen" der Klasse "Segment" rekursiv
aufgerufen!
Wenn die Klassen einer gemeinsamen Hierarchie angehören, können
mittels einer Konvertierung Verbundtyp-Elemente hinzugefügt oder
entfernt werden.
Das Entfernen von Elementen eines "tagged"-Verbundtyps geschieht
einfach durch eine Konvertierung mit dem Namen einer Klasse, die in der
Hierarchie höher liegt
(type_conversion
<BNF>).
Das Hinzufügen von Elementen zu einem "tagged"-Verbundtyp
wird durch Angabe eines Erweiterungsaggregates (extension_aggregate
<BNF>) durchgeführt.
P1 : Punkt.Punkt;
L1 : Linie.Linie;
L1 := Linie.Linie(P1 with x1 => 5, y1 => 7);
-- oder einfacher:
L1 := (P1 with x1 => 5, y1 => 7); |
Die Klammerschreibweise ist in beiden Fällen notwendig.
Die direkte Zuweisung von Objekten einer Klasse an Objekte einer anderen,
unterschiedlichen Klasse ist nicht möglich.
|