Laden...

Was bedeutet diese Interface-Definition?

Erstellt von erp-bt vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.496 Views
E
erp-bt Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren
Was bedeutet diese Interface-Definition?

Hallo zusammen,

ich versuche mich gerade in neue Design-Prinzipien einzuarbeiten und die dazugehörigen Beispiele sind alle in C#. Ich selbst komme aus der SAP-Welt und kann in Abap programmieren. Ich kenne C# eigentlich nicht, kann die meisten Beispiele aber i.d.R. lesen und verstehen.

Momentan habe ich aber ein Problem und vielleicht kann mir da einer weiter helfen. Ich habe folgendes Beispiel bei dem ein Interface definiert wird.

public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

Kann mir jemand erklären was der Zusatz in den spitzen Klammern bedeutet? Ist das ein spezieller Datentyp? Bedeutet dies das Methode Handle nur den Typ TCommand akzeptiert?

Abap kennt diesen Zusatz nicht. In Abap könnte ich ein Interface folgendermaßen definieren.

INTERFACE IF_COMMAND_HANDLER.

  METHODS HANDLE IMPORTING I_COMMAND TYPE REF TO OBJECT.

ENDINTERFACE.

OBJECT wäre in ABAP ein generischer Typ, könnte also jede beliebige Klasse bzw. Interface sein. Ich könnte natürlich auch eine definierte Klasse bzw. Interface angeben (also z.B. TYPE REF TO IF_COMMAND), glaube aber nicht das dies dem C# Beispiel entspricht.

Wäre schön wenn mir jemand hier erklären könnte was der Zusatz in den spitzen Klammern bedeutet.

Viele Grüße,
erp-bt

2.207 Beiträge seit 2011
vor 8 Jahren

Halo erp-bt,

das ist einfach ein generisches Interface. Den Typ kann man dann angeben. Das wird bei den generischen Collections sehr schön deutlich.

IList<string> myList = new List<string>

angegeben werden.

Schau auch mal hier:

Generics (C# Programming Guide)

da ist auch was mit Interfaces dabei.

Generic Interfaces (C# Programming Guide)

Gruss

Coffeebean

16.835 Beiträge seit 2008
vor 8 Jahren

Oft werden Generics nur als T definiert, wobei T einfach ein Platzhalter für einen Typ ist.
zB eben List<T> kann List<String>, List<Int32> oder eben List<MyClass> sein.

TCommand kann ebenfalls ABC heissen oder T; es ist jedoch üblich, dass man Einschränkungen in der generischen Typkennzeichnung hervorhebt.
Diese Einschränkung kann nun sein, dass T von Command erben muss.
public class List<T> where T: class, Command
oder ein Interface implementieren muss
public class List<T> where T: ICommand

Dahingehend ist es auch sehr verbreitet, dass man hier nicht T schreibt, sondern eben
public class List<TCommand> where TCommand: class, Command

Das würde nun die Gestaltung des Namens erklären.

E
erp-bt Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren

Hallo zusammen,

vielen Dank! Das hilft mir schon mal weiter. Ich poste mal die entsprechende Klasse dazu und versuche mal zu interpretieren was da definiert wird. Mal sehen ob ich es rictig verstanden habe.

public class MoveCustomerCommandHandler : ICommandHandler<MoveCustomerCommand>
{
    private readonly UnitOfWork db;

    public MoveCustomerCommandHandler(UnitOfWork db, [Other dependencies here])
    {
        this.db = db;
    }
 
    public void Handle(MoveCustomerCommand command)
    {
        // TODO: Logic here
    }
}

Ich definiere hier also eine Klasse MoveCustomerCommandHandler welche das Interface ICommandHandler implementiert. ICommandHandler muss jetzt dem Typ von MoveCustomerCommand entsprechen, richtig?
Oder ist MoveCustomerCommand einfach nur ein Platzhalter für einen beliebigen Typ? Jetzt bin ich mir gerade wieder unsicher.

Hier ist noch der Link zu dem kompletten Beispiel falls es jemanden interessiert.

https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91

Viele Grüße,
erp-bt

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

ICommandHandler muss jetzt dem Typ von MoveCustomerCommand entsprechen, richtig?

Fast. Wahrscheinlich meinst Du das richtige, drückst es aber ungünstig aus; genau genommen hast Du jetzt eine Klasse , die Dein Interface so implementiert, dass TCommand aus dem Interface der Typ MoveCustomerCommand ist.
Andere Typen kannst Du da jetzt nicht mehr verwenden (es sei denn sie erben von MoveCustomerCommand)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca