Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 20. Mai 2014, 15:18
Noch ohne auf die PDF geschaut zu haben: Das where in C# ist bei den Typeinschränkungen doch auch nichts anderes als der Doppelpunkt in Delphi. Und statt new() heißt es constructor .

Code:
public void meineMethode<T>(T meinParameter) where T: ISomeBaseInterface, ISomeOtherInterface
bedeutet in C# doch genauso, dass T beide Interfaces implementieren muss.

PS: Punkte und Vekoren. Ich wusste es

PPS: Warum überhaupt der Unterschied zwischen Punkten und Vektoren? Transformation wie bspw. Translation wird ja sowieso eigentlich doch über einen Vektor in homogenisierter Form mit einer Transformationsmatrix erledigt. Darüber lassen sich alle möglichen Operationen abwickeln.
Aber das führt jetzt nur vom eigentlichen Thema weg... (oder?)

PPPS: Warum möchtest du an der Stelle wissen, ob es nun ein IPoint oder IVector ist? Die richtige Typeinschränkung an diesen Fall wäre übrigens, anders als auf der PDF, IBase und nicht IPoint UND IVector.
Wenn du jetzt zur Laufzeit unbedingt wissen willst ob es nun ein IPoint oder IVector ist kannst du das mit Supports(..) überprüfen.


Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
   IBaseInterface = interface
      //
   end;

   IChildInterface1 = interface(IBaseInterface)
   ['{65F8AA65-0EED-4D26-A396-26999CD9E316}']
      //
   end;

   IChildInterface2 = interface(IBaseInterface)
   ['{8F390B34-CCF6-4908-B205-D4CD9CF5D3BE}']
      //
   end;

   TIChildClass1 = class(TInterfacedObject, IBaseInterface, IChildInterface1)
      // Es müssen IBaseInterface UND IChildInterface1 angegeben werden.
      // Ja, IBaseInterface ist eigentlich obsolet, aber so ist Delphi halt
      // Stört mich ehrlich gesagt auch
   end;

   TIChildClass2 = class(TInterfacedObject, IBaseInterface, IChildInterface2)
      //
   end;

   TSomeRecord = record
      public class procedure someMethod<T: IBaseInterface>(const someInput: T); static;

   end;

{ TSomeRecord }

class procedure TSomeRecord.someMethod<T>(const someInput: T);
begin
   if Supports(someInput, IChildInterface1) then
      WriteLn('Es ist ein IChildInterface1')
   else if Supports(someInput, IChildInterface2) then
      WriteLn('Es ist ein IChildInterface2')
   ;

end;

begin
  try
   TSomeRecord.someMethod( TIChildClass2.Create() );
  except
    on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;

  ReadLn;
end.

PPPPS: Generics und im Nachhinein wieder aufdröseln um im Detail nochmal zu schauen was drinsteckt führt Generics ad absurdum. So meine Meinung ohne gründlich drüber nachgedacht zu haben.

Geändert von Der schöne Günther (20. Mai 2014 um 15:39 Uhr)
  Mit Zitat antworten Zitat