2010-12-21 24 views
50

¿Puedo crear clases parciales en diferentes espacios de nombres? ¿Funcionará correctamente? e.x .:Clase parcial en diferentes espacios de nombres

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? 
    } 
} 

¿Qué debo hacer para que funcione? (si mi ejemplo no es correcto)

Respuesta

73

El nombre de una clase incluye su espacio de nombres, por lo que name1.Foo y name1.name2.Foo son dos tipos completamente separados. Entonces la respuesta corta a su pregunta es: No.

¿Por qué necesita hacer algo como esto?

+0

Quiero hacer bibliotecas separadas. Para agregar nuevas funcionalidades a la clase principal sin modificarla. Tengo un gran agujero en mi mente relacionado con este tema ... – RAMe0

+7

Bueno, sugeriría dos posibilidades. El primero sería crear una subclase para 'name1.Foo' en' name1.name2.Foo'. El segundo sería usar métodos de extensión (http://msdn.microsoft.com/en-us/library/bb383977.aspx) que es una gran manera de "agregar" funcionalidad a las clases que no controlas, o para cualquier razón, no quiero modificar. – CodingGorilla

+3

@ RAMe0: las clases parciales se resuelven en tiempo de compilación, no hay ningún sentido de tipo parcial en .NET es una construcción de lenguaje. Permite que el _source code_ de una clase aparezca en múltiples archivos de origen durante la compilación. – AnthonyWJones

7

Esto no funcionará. El compilador le dará un error de nombre ambiguo en la línea Foo classFoo = new Foo();. Para que las clases parciales funcionen, deben estar en el mismo espacio de nombres porque el espacio de nombres es realmente parte del nombre completo del tipo.

+0

Entiendo esto, es por eso que estoy preguntando ... por favor lea el comentario a la respuesta anterior – RAMe0

+0

El comentario de @Coding Gorilla es correcto. Si simplemente desea agregar métodos a un tipo, la subclasificación (si el tipo no está sellado) o el uso de métodos de extensión es el camino a seguir. –

21

La clase parcial solo es posible en el mismo espacio de nombres y en el mismo conjunto.

El espacio de nombre puede estar en dos conjuntos diferentes pero la clase parcial no.

8

Éstos son algunos puntos a tener en cuenta al implementar las clases parciales: -

  • uso de palabras clave parcial en cada parte de la clase parcial.

  • El nombre de cada parte de la clase parcial debe ser el mismo, pero el nombre del archivo de origen para cada parte de la clase parcial puede ser diferente.

  • Todas las partes de una clase parcial deben estar en el mismo espacio de nombres.

  • Cada parte de una clase parcial debe estar en el mismo ensamblado o DLL, en otras palabras, no puede crear una clase parcial en los archivos fuente de un proyecto de biblioteca de clase diferente.

  • Cada parte de una clase parcial tiene la misma accesibilidad. (como privado, público o protegido)

  • Si hereda una clase o interfaz en una clase parcial, entonces se hereda en todas las partes de una clase parcial.

  • Si una parte de una clase parcial está sellada, toda la clase será sellada.

  • Si una parte de la clase parcial es abstracta, toda la clase se considerará una clase abstracta.

3

Además, para las clases estáticas se pueden implementar algo como esto con la ayuda de fresca C# 6.0 using static feature.

considerar:

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(); 
     } 
    } 
} 

derecho, que no se compila, el mensaje de error es clara. Para solucionar la situación puede especificar directamente los espacios de nombres (pero no desea que esto por lo que yo entiendo):

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

O Se puede aplicar utilizando la característica estática esta manera:

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

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

Quizás esté bien hacer esto para algunas clases de ayuda/utilidades. Pero las clases parciales no son el camino, como otros han notado.

Cuestiones relacionadas