2017-12-06 1 views
-1
modifiziert werden

Lasst uns sagen, dass ich eine Schnittstelle:In C# wie eine Klasse zu verhindern, dass

interface IPerson 
{ 
    int Age { get; set; } 
    string Name { get; set; } 
    bool Alive { get; set; } 
} 

und eine Klasse:

public class Person : IPerson 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

, die seit Person nicht kompilieren würde nicht implementiert die Alive Property .

Was ich gerne wissen würde, ist, wenn es eine Möglichkeit gibt, das gleiche Verhalten zu haben, wenn Person eine zusätzliche Eigenschaft hinzufügt, die in seiner Schnittstelle nicht gefunden wird.

interface IPerson 
{ 
    int Age { get; set; } 
    string Name { get; set; } 
} 

und eine Klasse:

public class Person : IPerson 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    public bool Alive { get; set; } <---- This should prevent it from compiling as well. 
} 

Ich würde es nicht so gut, oder zumindest geben Sie mir eine Kompilierung Warnung erfolgen soll, kompilieren.

+2

Warum brauchen Sie das? – CodeFuller

+2

Aus der Sicht des Compilers ist es nicht falsch, einer Klasse, die eine Schnittstelle implementiert, Eigenschaften hinzuzufügen. Warum willst du dieses Verhalten? – Yuck

+1

Wenn Sie die Schnittstelle in Ihren Anwendungen verwenden und die verwendete konkrete Klasse nicht angeben, weiß Ihre Anwendung nichts über die zusätzlichen Eigenschaften und Methoden. – James

Antwort

3

Nein. Schnittstellen definieren, welche Elemente ein Objekt implementieren muss. Sie können keine Member definieren, die ein Objekt nicht implementieren kann. Sie könnten möglicherweise Ihre eigenen benutzerdefinierten Codeanalysewerkzeuge von Drittanbietern verwenden, um Fälle wie diese zu identifizieren, aber es gibt nichts in der Sprache selbst, das dies unterstützt.

2

Nein, das ist nicht möglich. Versuchen Sie nicht, hier selbst eine class zu definieren? Warum brauchst du wirklich eine Schnittstelle?

jedoch, was Sie erreichen können, ist Anrufe an Ihre Schnittstelle machen und nicht die Klasse von

tun
IPerson person = new Person(); 

diese Weise können Sie die Person, Objekt für den Zugriff beschränken nur die in der Schnittstelle definierten Methoden.

0

Es gibt eine Möglichkeit, dies zu tun, aber nicht innerhalb des Objekts und es ist ein bisschen albern in der Konstruktion des Objekts zu verwenden. Unter Verwendung von Reflection können Sie die type einer Instanz Ihres Objekts überprüfen und durch seine Eigenschaften iterieren und eine Ausnahme auslösen, wenn die Anzahl oder Namen der Eigenschaften nicht mit Ihrer gewünschten Instanz übereinstimmen. Bitte beachten Sie, dass, wenn Sie nur die Schnittstelle überprüfen, die implementierenden Objekte bestanden werden, so dass Sie den gewünschten konkreten Typ überprüfen würden. Ich bin am Telefon oder füge einen Beispielcode hinzu und versuche, später darauf zurückzukommen.

+0

Hier ist, was wir getan haben, mit Reflektion, ich habe eine Zeichenfolge erstellt, die alle Felder und den Namen einer Klasse enthält. Ich habe dann den HashCode dieser Saite bekommen. Ich habe das in eine Const in einer neuen Klasse gebracht. Diese Klasse hat eine Methode, die alle Klassen testet, die ich nicht ändern möchte, um den aktuellen Hashcode der Zeichenkette mit dem Original zu erhalten. Wenn sich die Klasse in der Zukunft ändert, wird der Hashcode nicht mehr mit demjenigen übereinstimmen, den ich fest codierte, und eine Nachricht wird erscheinen, wenn die App startet. – SerenityNow

0

Es gibt eine Möglichkeit, dies zu tun, aber nicht innerhalb des Objekts und es ist ein bisschen albern in der Konstruktion des Objekts zu verwenden. Unter Verwendung von Reflection können Sie die type einer Instanz Ihres Objekts überprüfen und durch seine Eigenschaften iterieren und eine Ausnahme auslösen, wenn die Anzahl oder Namen der Eigenschaften nicht mit Ihrer gewünschten Instanz übereinstimmen. Bitte beachten Sie, dass, wenn Sie nur die Schnittstelle überprüfen, die implementierenden Objekte bestanden werden, so dass Sie den gewünschten konkreten Typ überprüfen würden. Ich bin auf meinem Telefon, also kein Beispielcode. Werde später versuchen, darauf zurückzukommen.

Verwandte Themen