2016-05-18 20 views
1

nehme ich eine generische Klasse in C#, deren Erklärung haben wie folgt aussieht:Leere Schnittstelle oder leere Basisklasse als Typ-Parameter Einschränkung verwenden

public abstract class DtoQuery<T> where T : class 
{ } 

Nun wird der Typ-Parameter ein „Dto“ immer gedacht Klasse. Ich habe eine Reihe von diesen, aber das "Problem" ist, dass sie gemeinsam nichts haben. Sie alle haben nur eine Reihe von (eindeutigen) öffentlichen Eigenschaften und keine Methoden.

Idealerweise möchte ich meine Klasse DtoQuery<T> nur solche "Dto" -Klassen als ihren Typparameter akzeptieren lassen. Also müsste ich entweder eine leere Schnittstelle IDto oder eine leere abstract class Dto erstellen.

Frage: mit welcher soll ich gehen? Hinweis: Die DTO-Klassen erweitern niemals etwas anderes!

(P. S. für die Neugierigen: Ich verspreche, dass ich nicht etwas extrem dumm und albern, das ist Dienstprogramm-Funktionalität in einem Test-Projekt und wird nicht für Produktionscode verwendet werden).

+1

Da es sowieso leer ist, würde ich für die Schnittstelle gehen. Aber da es dir nicht wichtig ist (nach deinem P. S.) und keine Konsequenzen haben wird, warum fragst du überhaupt? Das ist noch nicht einmal meine Meinung, rolle einfach einen Würfel :) –

+0

@ RenéVogt Ich frage, weil die Tatsache, dass ich keinen Grund weiß, warum es einen Unterschied macht, nicht heißt, dass sonst niemand in der Gemeinde ein kennt Grund. Dafür sind Fragen, nicht wahr :)? Was wäre, wenn * dies eine Produktionscodesituation wäre? – MarioDS

+0

Welchen * Code * können Sie schreiben, wenn der generische Typ, mit dem Sie es zu tun haben, keine Methoden oder Eigenschaften hat? –

Antwort

2

Angenommen, Sie haben (warum auch immer), eine Hierarchie, die wie folgt aussieht:

public class Person { } 
public class Employee : Person { } 
public class Boss : Person { } 

Nun stell dir vor, dass wir nicht wollen, ein Person als DTO behandelt werden - wir nur Mitarbeiter wollen und Boss, DTOs zu sein.

In dieser Situation wäre es unmöglich, eine abstrakte Klasse zu verwenden, um ein DTO zu bezeichnen, da Sie nur von einem Elternteil in C# erben können.

Das ist ein objektiver Grund, warum die Verwendung einer Schnittstelle besser ist. Subjektiv sind Schnittstellen auch besser, weil der Zweck einer abstrakten Klasse darin besteht, einige Funktionen bereitzustellen. Ansonsten hat es keinen Vorteil gegenüber einer Schnittstelle.

Die Faustregel lautet: Verwenden Sie immer eine Schnittstelle, wenn Sie sich nicht sicher sind. Verwenden Sie nur eine abstrakte Klasse, wenn Sie Implementierung benötigen.

2

Ich stimme @ Rob Antwort, aber da Sie erwähnt, dass „die Dto Klassen werden nie etwas anderes oder jede andere erweitern“ Ich werde einen anderen Grund hinzufügen, die Sie auf eine Schnittstelle kippen könnte:

Wenn Sie wählen eine Schnittstelle, Sie können sie intern halten. Eine öffentliche Klasse kann eine interne Schnittstelle implementieren, sie kann jedoch keine interne Klasse erweitern. Das bedeutet auch, dass die Benutzer Ihrer Bibliothek keine neuen DTO-Typen mit derselben abstrakten Basisklasse erstellen können.

Sie haben auch erwähnt, dass dies in einem Testprojekt verwendet wird. Verwenden Sie daher das Attribut [assembly: InternalsVisibleToAttribute("Name.Of.Test.Project")], um es nur Ihrer Testbaugruppe zur Verfügung zu stellen.