2010-12-21 9 views
50

Kann ich partielle Klasse in verschiedenen Namespaces erstellen? Wird es funktionieren? e.x .:Teilklasse in verschiedenen Namespaces

class1.cs

namespace name1 
{ 
    public partial class Foo 
    { 
     Bar1(){ 
      return 10; 
     } 
    } 
} 

class2.cs

namespace name1.name2 
{ 
    public partial class Foo 
    { 
     Bar2(){ 
      return 100; 
     } 
    } 
} 

main.cs

using name1; 
using name1.name2; 

namespace mainClass 
{ 
    public class mainClass 
    { 
     Foo classFoo = new Foo(); 
     int Count = classFoo.Bar1() + classFoo.Bar2(); 
     // Will Count = 110? 
    } 
} 

Was soll ich tun, damit es funktioniert? (Wenn mein Beispiel nicht korrekt ist)

Antwort

73

Der Name einer Klasse enthält ihren Namespace, also name1.Foo und name1.name2.Foo sind zwei völlig getrennte Typen. Also die kurze Antwort auf Ihre Frage lautet: Nein.

Warum müssen Sie so etwas tun?

+0

Ich möchte separate Bibliotheken erstellen. Um der Hauptklasse neue Funktionen hinzuzufügen, ohne sie zu ändern. Ich habe ein großes Loch in meinem Kopf zu diesem Thema ... – RAMe0

+7

Nun, ich würde zwei Möglichkeiten vorschlagen. Die erste wäre, eine Unterklasse für 'name1.Foo' in' name1.name2.Foo' zu erstellen. Die zweite wäre die Verwendung von Erweiterungsmethoden (http://msdn.microsoft.com/en-us/library/bb383977.aspx), die eine großartige Möglichkeit ist, Funktionen zu Klassen hinzuzufügen, die Sie entweder nicht steuern oder für die Sie nicht möchten aus irgendeinem Grund, möchte nicht ändern. – CodingGorilla

+3

@ RAMe0: Teilklassen werden zur Kompilierzeit aufgelöst, es gibt keinen Sinn für einen Partialtyp in .NET ist ein Sprachkonstrukt. Dadurch kann der _Source-Code_ einer Klasse während der Kompilierung in mehreren Quelldateien angezeigt werden. – AnthonyWJones

7

Dies wird nicht funktionieren. Der Compiler wird Ihnen einen mehrdeutigen Namensfehler in der Zeile Foo classFoo = new Foo(); geben. Damit Teilklassen funktionieren, müssen sie sich im selben Namespace befinden, da der Namespace tatsächlich Teil des vollständig qualifizierten Namens des Typs ist.

+0

Ich verstehe das, deshalb frage ich ... bitte lesen Sie den Kommentar zur vorherigen Antwort – RAMe0

+0

@Coding Gorillas Kommentar ist korrekt. Wenn Sie einfach Methoden zu einem Typ hinzufügen möchten, ist entweder die Unterklasse (wenn der Typ nicht versiegelt ist) oder die Verwendung von Erweiterungsmethoden der richtige Weg. –

21

Teilklasse ist nur in demselben Namensraum und derselben Baugruppe möglich.

Der Namespace könnte in zwei verschiedenen Assemblies sein, aber die partielle Klasse konnte nicht.

8

Hier sind einige Punkte zu prüfen, während die Teilklassen der Umsetzung: -

  • Verwenden partial-Schlüsselwort in jedem Teil der Teilklasse.

  • Der Name jedes Teils der partiellen Klasse sollte gleich sein, aber der Name der Quelldatei für jeden Teil der partiellen Klasse kann unterschiedlich sein.

  • Alle Teile einer partiellen Klasse sollten sich im selben Namespace befinden.

  • Jeder Teil einer partiellen Klasse sollte sich in derselben Assembly oder DLL befinden, dh Sie können keine partielle Klasse in Quelldateien eines anderen Klassenbibliotheksprojekts erstellen.

  • Jeder Teil einer Teilklasse hat die gleiche Zugänglichkeit. (wie privat, öffentlich oder geschützt)

  • Wenn Sie eine Klasse oder Schnittstelle für eine partielle Klasse erben, wird sie für alle Teile einer partiellen Klasse vererbt.

  • Wenn ein Teil einer Teilklasse versiegelt ist, wird die gesamte Klasse versiegelt.

  • Wenn ein Teil der partiellen Klasse abstrakt ist, wird die gesamte Klasse als abstrakte Klasse betrachtet.

3

Auch für statische Klassen können Sie so etwas wie dies mit Hilfe von frischen C# 6.0 using static feature implementieren.

Bedenken Sie:

namespace SomeLogic1 
{ 
    public static class Util 
    { 
     public static int Bar1() 
     { 
      return 1; 
     } 
    } 
} 

namespace SomeLogic2 
{ 
    public static class Util 
    { 
     public static int Bar2() 
     { 
      return 2; 
     } 
    } 
} 

namespace GeneralStuff 
{ 
    using SomeLogic1; 
    using SomeLogic2; 

    public class MainClass 
    { 
     public MainClass() 
     { 
      // Error CS0104 
      // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util' 
      var result = Util.Bar1() + Util.Bar2(); 
     } 
    } 
} 

Richtig, das nicht kompiliert, die Fehlermeldung klar. Um die Situation zu beheben Sie direkt Namensraum angeben können (aber Sie wollen nicht, dies so weit wie ich verstehe):

namespace GeneralStuff 
{ 
    public class MainClass 
    { 
     public MainClass() 
     { 
      var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
     } 
    } 
} 

ODER Sie mit statischer Funktion auf diese Weise anwenden können:

namespace GeneralStuff 
{ 
    using static SomeLogic1.Util; 
    using static SomeLogic2.Util; 

    public class MainClass 
    { 
     public MainClass() 
     { 
      var result = Bar1() + Bar2(); 
     } 
    } 
} 

Vielleicht ist es in Ordnung, dies für einige Helfer/utils-Klassen zu tun. Aber partielle Klassen sind nicht der richtige Weg, wie andere es bemerkt haben.

Verwandte Themen