2016-07-20 7 views
1

Ich habe drei Projekte A, B und C. Diese werden so miteinander verbunden, wie:Referenzprojekt B ohne C

A -> B -> C

Wenn Projekt C einer Base, wie so hat:

public class CBaseClass 
{ 
    public string Name { get; set; } 
} 

und Projekt B hat einen erbenden Klasse wie folgt:

public class BInheritingClass : CBaseClass 
{ 

} 

Wie kann ich BInheritingClass.Name in Projekt A zugreifen, ohne dass es mir den gibt folgende Fehler:

The type 'CBaseClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'ProjectC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

wenn ich

I Projekt A B Referenz möchte klar nicht eine Referenzierung C., die

ohne A Referenzierung C. Dinge aus C verwendet, ist das möglich?

+0

warum kümmert es dich? Es ist keine schwierige Aufgabe, eine Projektreferenz hinzuzufügen. – ADyson

+0

@ADyson Weil ich möchte, dass Projekt A dumm von C ist, was ich denke, ist ziemlich vernünftig – TheLethalCoder

+0

Sie wollen, dass, aber wie die Antworten zeigen, ist es nicht möglich.Code in Projekt A muss wissen, wie CBaseClass definiert ist, um diese Klasse zu verwenden. – ADyson

Antwort

4

Sie können die Referenzierung von C nicht vermeiden, da CBaseClass Teil der öffentlichen Schnittstelle von BInheritingClass ist. Projekt A hat keine Möglichkeit, die vollständige Definition von BInheritingClass zu kennen, ohne zu wissen, CBaseClass.

Wenn Sie dies vermeiden wollen, müssen Sie die Vererbung und Nutzung Zusammensetzung vermeiden - BInheritedClassnicht erben CBaseClass, verzichten und stattdessen intern enthalten, nicht als Parameter oder öffentliche Mitglied ausgesetzt wird. Nur so kann es ein Implementierungsdetail von B bleiben, nicht Teil seines Vertrags.

+0

Abgesehen von der Erstellung eines Wrappers gibt es keine Möglichkeit, 'ProjectC' in' ProjectB' einzubetten? – TheLethalCoder

+0

@TheLethalCoder Sie können ein paar Tricks ziehen und durch die Rahmen springen und ProjectC in ProjectB einbetten - aber wie ist das anders, als nur einen Verweis auf ProjectC hinzuzufügen? –

0

Nein, Sie können keine Klasse verwenden, die in einer Baugruppe definiert ist, die Sie nicht referenziert haben. (Ausgenommen dynamische Belastung mit Reflexion). Durch die Pflege dieser Referenzhierarchie wurden Werkzeuge wie NuGet entwickelt.

2

Wenn das Projekt A in irgendeiner Weise öffentlich definierte Objekte im Projekt C verwendet, müssen Sie auf C verweisen. In Ihrem Beispiel definiert Projekt A eine Klasse basierend auf etwas in C definiert, so müssen Sie C. referenzieren


Sie aktualisiert Ihre Frage
Diese Antwort ist immer noch wahr: Wie B ein BInheritingClass definiert basierend auf CBaseClass definiert in C, A muss C wissen, wenn es die Klasse in B verwenden möchte, sonst würde es die "Basisfunktionen" von CBaseClass nicht kennen und kann daher die Merkmale von BInheritingClass nicht bestimmen.

Wenn Sie nicht A wollen „wissen“ C, können Sie nicht alles von C durch B-A aussetzen. Zusammensetzung ist eine Lösung für das Problem, aber das bedeutet im Wesentlichen, dass Sie die öffentliche Schnittstelle von CBaseClass in BNoLongerInheritingClass umgestalten müssen.

Verwandte Themen