2016-07-28 7 views
-3

Können Sie eine Methode erstellen, die erfordert, dass ein Parameter von einem anderen erbt?Ist es in C# möglich, Methodenparameter auf eine Klasse zu beschränken, die von einer anderen Klasse erbt?

Angenommen, ich schreibe eine externe Bibliotheksklasse.

abstract class ImTheBaseClass 
{ 
public int Age {get;set;} 
} 

class Does : ImTheBaseClass 
{} 

class AlsoDoes : ImTheBaseClass 

class DoesNot 
{} 

Kann ich schreibe eine Methode, die Does und AlsoDoes (oder eine beliebige Anzahl von Permutationen) als Parameter akzeptiert, lehnt aber doesnot (zum Zeitpunkt der Kompilierung, nicht gestartet werden)?

+0

Ihre Paramater-Typ geben sein 'Does' nicht die Basisklasse –

+0

@ AD.Net' DoesNot' Vererbt die Basisklasse nicht, daher wäre die Verwendung als Parametertyp in Ordnung. –

+0

Ich denke, ich hätte klarstellen sollen ... das wird in einer Bibliothek sein, also habe ich keine Kontrolle darüber, was sie weitergeben. Ich werde meine Frage aktualisieren. – Webjedi

Antwort

5

Ja, um den Parameter als ImTheBaseClass Typ haben und somit können alle abgeleiteten Typ übergeben werden.

+0

Danke. Ich wusste nicht, dass der abgeleitete Typ so funktioniert. – Webjedi

+0

Ich wusste, dass dies mit Interfaces möglich war, aber ich suchte nicht nach verschiedenen Implementierungen von Methoden. Ich möchte nur sicherstellen, dass eine abgeleitete Klasse bestimmte erwartete Eigenschaften hat. – Webjedi

5

Sicher; Deklarieren Sie den Parameter einfach als Does (oder als Ihre Basisklasse).

+0

Wenn Sie den Parameter vom Typ 'Does' deklarieren, akzeptiert die Methode kein 'AlsoDoes' – derpirscher

0

Anstelle einer Basisklasse könnten Sie eine Schnittstelle verwenden, wenn es Ihren Anforderungen entspricht, dann ist der Parameter diese Schnittstelle.

interface IClass 
{ 
    int Age {get;set;} 
} 

class Does : IClass 
{} 

class DoesNot 
{} 
+0

Ich sehe nicht, wie die abstrakte Schnittstelle zu einer Klasse ändert, einen Unterschied für die Frage machen. –

+0

@CharlesMager Es tut nicht, aber meiner Meinung nach gegeben das Beispiel gezeigt, eine Schnittstelle macht mehr Sinn – TheLethalCoder

+0

Braucht nicht wirklich eine Schnittstelle, aber, ja, das Prinzip ist das gleiche. Er kann die Basisklasse oder eine Schnittstelle als Parametertyp verwenden, wenn keine Basisimplementierung erforderlich ist. – ManoDestra

1

Sicher Sie können. Sie müssen nur die Basisklasse als Parameter es

public void MyMethod(ImTheBaseClass myvar) 
{ 
...something 
} 

kann dann nennen wie diese

wird
var x= new Does(); 
MyMethod(x); 
+2

Könnte auch 'Does x = new Does();' angeben, da es immer noch eine Unterklasse der Basisklasse ist. – ManoDestra

+1

ja, du hast recht :) –

Verwandte Themen