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)

2voto

Sandeep Points 352

Restrictions on partial classes and method from MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx

translated to :

Restrictions sur les classes partielles et les méthodes de MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx

1voto

Matt Points 3445

Je suppose que votre objectif principal était de répartir les méthodes entre différents espaces de noms, sinon cela aurait été trivial (mettre tout dans une seule classe, qu'elle soit partielle ou non, et vous avez terminé).

Les objectifs supposés sont donc les suivants:

  • Avoir les 2 méthodes Bar1 dans l'espace de noms name1 et Bar2 dans l'espace de noms name1.name2
  • Pouvoir appeler l'une ou l'autre des méthodes ci-dessus dans le contexte d'une seule classe, ici ClsFoo

Vous ne pouvez pas atteindre cela avec des classes partielles, mais vous pouvez le faire d'une manière différente: si vous utilisez des méthodes d'extension et les liez à une classe particulière, ici ClsFoo, alors vous pouvez faire ce qui suit:

using SomeOtherNamespace;
using name1;
using name1.name2;

namespace mainClass
{
    public static class mainClass
    {
        public static void Main()
        {
            var classFoo = new ClsFoo();
            var count = classFoo.Bar1() + classFoo.Bar2();
            Console.WriteLine($"compte = {count}"); // le résultat est 110
        } // main               
    } // class
} // namespace

namespace SomeOtherNamespace
{
    public class ClsFoo
    {
        // n'a pas besoin de contenir de code
    } // class
} // namespace

namespace name1
{
    public static class FooExt
    {
        public static int Bar1(this ClsFoo foo)
        {
            return 10;
        } // méthode
    } // class
} // namespace

namespace name1.name2
{
    public static class FooExt
    {
        public static int Bar2(this ClsFoo foo)
        {
            return 100;
        } // méthode
    } // class
} // namespace

Exécutez-le en ligne

De cette manière, vous déclarez une classe vide ClsFoo puis écrivez des méthodes d'extension Bar1() et Bar2(), qui résident dans des espaces de noms et des classes d'extension statiques différentes.

Remarque: Les classes d'extension peuvent avoir le même nom FooExt tant qu'elles sont dans des espaces de noms différents, bien sûr vous pouvez également leur donner des noms différents comme FooExt1 et FooExt2 si vous le souhaitez - et l'exemple fonctionnera toujours; même dans les anciennes versions de C#.

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