2016-03-31 6 views
3

Szenario:
Ich habe 3 Klassen (A, B, C) in meinem Windows Runtime Component-Projekt.Vererbung in Windows Runtime Component unmöglich?

class A{} 
public sealed class B : A {} 
public sealed class C : A {} 

Auf den obigen Code kompiliert, erhalte ich die folgenden Fehler:

"Uneinheitliche Zugänglichkeit. Basisklasse 'A' ist weniger zugänglich als Klasse 'C'"

Wenn ich ein öffentlich machen Klasse, gibt es einen Kompilierungsfehler: „. Entsiegelt Arten exportieren wird nicht unterstützt Bitte Typ markieren‚MyProject.A‘wie versiegelt“

Aber jetzt, wenn ich A als versiegelt mache, können B und C nicht davon erben.

Angesichts der Tatsache, dass nur WinRT-Typen für die Vererbung zugelassen sind, ist es irgendwie möglich, benutzerdefinierte/benutzerdefinierte Klassen für die Vererbung zu verwenden? Wenn nicht, gibt es einen Workaround, um dasselbe zu erreichen?

+2

Die Fähigkeit, Javascript oder native C haben ++ Code direkt ausführen, Sprachen, die keine Unterstützung für die Vererbung oder tun es eine dramatisch anders Weg, kommt natürlich mit ein paar Kompromissen. Entweder muss A eine Schnittstelle sein oder du musst es einkapseln. Wenn Client-Code nur C# ist, verwenden Sie stattdessen eine normale Klassenbibliothek. –

+1

@HansPassant wäre das keine perfekte Antwort auf die Frage? – Domysee

+0

Jeder mag glückliche Antworten, ich habe kein Interesse, unglückliche zu unterstützen. –

Antwort

1

Wie Sie selbst herausgefunden haben, können Sie keine Klassen freigeben, die von anderen in einer Windows-Laufzeitkomponente erben. Das ist auch dann der Fall, wenn Sie versuchen, eine abstrakte Klasse als Elternklasse zu verwenden. Dies ist ein "Nachteil", der erforderlich ist, damit WinRT-Komponenten mit allen anderen Sprachen funktionieren, die das WinRT-Framework unterstützt. Der einzige Weg, dies zu umgehen, ist die Vermeidung von Vererbung. Sie können nur Schnittstellen verwenden oder Objekt Zusammensetzung, wo Sie die Vererbung Verhalten simulieren, zB:

public sealed class A 
{ 
    public void Method() { } 
} 
public sealed class B 
{ 
    A a; 

    public void Method() 
    { 
     // Do B stuff 

     // Call fake "virtual" method 
     a.Method(); 
    } 
} 
Verwandte Themen