71 votes

Partial class in different namespaces

Puis-je créer une classe partielle dans différents espaces de noms? Est-ce que cela fonctionnera correctement? ex :

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

Que dois-je faire pour que cela fonctionne ? (si mon exemple n'est pas correct)

100voto

CodingGorilla Points 12373

Le nom d'une classe inclut son espace de noms, donc name1.Foo et name1.name2.Foo sont deux types complètement différents. Donc la réponse courte à votre question est : Non.

Pourquoi avez-vous besoin de faire quelque chose comme ça ?

0 votes

Je veux créer des bibliothèques séparées. Ajouter de nouvelles fonctionnalités à la classe principale sans la modifier. J'ai un énorme trou dans mon esprit concernant ce sujet...

9 votes

Eh bien, je suggérerais deux possibilités. La première consisterait à créer une sous-classe pour name1.Foo dans name1.name2.Foo. La deuxième serait d'utiliser des méthodes d'extension (msdn.microsoft.com/en-us/library/bb383977.aspx) qui est une excellente façon d'"ajouter" des fonctionnalités aux classes que vous ne contrôlez pas, ou pour une raison quelconque, que vous ne souhaitez pas modifier.

4 votes

@RAMe0: Les classes partielles sont résolues au moment de la compilation, il n'y a pas de notion de type partiel en .NET c'est une construction de langage. Cela permet au code source d'une classe d'apparaître dans plusieurs fichiers source pendant la compilation.

30voto

Abdul Saboor Points 775

La classe partielle n'est possible que dans le même espace de noms et la même assembly.

L'espace de noms pourrait être dans deux assemblies différents mais la classe partielle ne pourrait pas.

15voto

Farhan S. Points 182

Voici quelques points à considérer lors de la mise en œuvre des classes partielles :-

  • Utilisez le mot-clé partial dans chaque partie de la classe partielle.

  • Le nom de chaque partie de la classe partielle doit être le même, mais le nom du fichier source pour chaque partie de la classe partielle peut être différent.

  • Toutes les parties d'une classe partielle doivent être dans le même espace de noms.

  • Chaque partie d'une classe partielle doit être dans le même assembly ou DLL, en d'autres termes, vous ne pouvez pas créer une classe partielle dans des fichiers source d'un projet de bibliothèque de classes différent.

  • Chaque partie d'une classe partielle a la même accessibilité (comme privée, publique ou protégée).

  • Si vous héritez d'une classe ou d'une interface sur une classe partielle, elle est héritée sur toutes les parties de la classe partielle.

  • Si une partie d'une classe partielle est scellée, alors l'ensemble de la classe sera scellé.

  • Si une partie d'une classe partielle est abstraite, alors l'ensemble de la classe sera considérée comme une classe abstraite.

Classes partielles en C#

7voto

Harry Steinhilber Points 2603

Cela ne fonctionnera pas. Le compilateur vous donnera une erreur de nom ambigu sur la ligne Foo classFoo = new Foo();. Pour que les classes partielles fonctionnent, elles doivent être dans le même espace de noms car l'espace de noms fait en fait partie du nom entièrement qualifié du type.

1 votes

Je comprends cela, c'est pourquoi je demande... merci de lire le commentaire à la réponse précédente

0 votes

@Le commentaire de Coding Gorilla est correct. Si vous voulez simplement ajouter des méthodes à un type, soit vous sous-classez (si le type n'est pas scellé) soit vous utilisez des méthodes d'extension.

5voto

psfinaki Points 500

De plus, pour les classes statiques, vous pouvez implémenter quelque chose comme ceci avec l'aide du nouveau élément statique de C# 6.0.

Considérez :

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()
        {
            // Erreur CS0104
            // 'Util' est une référence ambiguë entre 'SomeLogic1.Util' et 'SomeLogic2.Util'
            var result = Util.Bar1() + Util.Bar2(); 
        }
    }
}  

Exactement, cela ne compile pas, le message d'erreur est clair. Pour résoudre la situation, vous pouvez spécifier directement les espaces de noms (mais vous ne voulez pas ça autant que je comprends) :

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

OU vous pouvez appliquer la fonctionnalité using static de cette manière :

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

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

Peut-être que c'est correct de le faire pour certaines classes d'aide/utilitaires. Mais les classes partielles ne sont pas la solution, comme d'autres l'ont remarqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X