web-dev-qa-db-fra.com

Comment une classe statique peut-elle dériver d'un objet?

J'essaie d'hériter d'une classe non statique par une classe statique.

public class foo
{ }

public static class bar : foo
{ }

Et je reçois:

La classe statique ne peut pas dériver du type . Les classes statiques doivent dériver de objet.

Comment puis-je le tirer d'objet?

Le code est en C #.

37
Ali

Il n'y a aucune valeur à dériver des classes statiques. Les raisons d'utiliser l'héritage sont:

  • Polymorphisme
  • Réutilisation de code

De toute évidence, vous ne pouvez pas obtenir de polymorphisme avec des classes statiques, car il n’existe aucune instance sur laquelle envoyer de façon dynamique (c’est-à-dire que ce n’est pas comme si vous pouviez transmettre un Bar à une fonction qui attend un Foo, puisque vous n'avez pas avez un bar).

La réutilisation de code est facilement résolue en utilisant la composition: donnez à Bar une instance statique de Foo.

48
munificent

Dans la spécification C # 3.0, section 10.1.1.3:

Une classe statique ne peut pas inclure un classe-base spécification (§10.1.4) et ne peut pas spécifier explicitement une classe de base ou une liste des interfaces implémentées. UNE La classe statique hérite implicitement de tapez object.

En d'autres termes, vous ne pouvez pas faire cela.

22
Jon Skeet

Le message d'erreur est faux. Ce n'est pas dire "un" objet. Il s'agit du type intégré appelé "objet" qui est la base de tout dans .NET.

Il devrait dire "les classes statiques ne peuvent pas spécifier un type de base".

13
GeekyMonkey

Tiré de http://msdn.Microsoft.com/en-us/library/79b3xss3(VS.80).aspx

Les principales caractéristiques d'une classe statique sont:

Ils ne contiennent que des membres statiques.

Ils ne peuvent pas être instanciés.

Ils sont scellés.

Ils ne peuvent pas contenir Instance Constructeurs (Guide de programmation C #).

Ainsi, hériter d'une classe non statique viole la première fonctionnalité des classes statiques de cette liste en introduisant des membres non statiques dans votre classe statique.

7

Je ne pense pas que C # prenne en charge l'héritage pour les classes statiques.

Une option serait d'utiliser le motif singleton à la place

public class foo
{ }

public class bar : foo
{
    private bar instance;
    public bar GetInstance()
    {
        if(instance == null) instance = new bar();
        return instance;
    }

    private bar(){} //make default constructor private to prevent instantiation 
}
2
RSlaughter

Comme indiqué précédemment, les spécifications C # disent que cela ne peut pas être fait. Vous ne pouvez pas non plus implémenter une interface avec des classes statiques. Votre meilleur pari est de passer d'une classe statique à une classe utilisant le modèle singleton. Vous n'aurez qu'une seule instance (similaire au fonctionnement de la classe statique) et pourrez hériter du comportement ou implémenter des interfaces.

Vous lisez sur Singletons ici , ici et ici .

1
RS Conley

Comme Christopher l'a fait remarquer, supposons que nous puissions dériver une classe statique d'une classe non statique. 

par exemple:

public class foo
{
    public int myVar;
}

public static class bar : foo { }

ici, bar classe dérivée de foo , donc classe statique Bar a un membre non statique myVar now, et selon la spécification c #, la classe statique ne peut pas contenir non membres statiques!

1
kokabi

une classe statique ne peut pas être une classe de base pour d'autres classes et ne peut pas être étendue.

la classe statique ne peut être héritée que de la classe "objet" (classe de base .net).

Informations complémentaires: Toutes les classes au format .net héritées de la classe "objet", même les classes statiques également. 

La différence est que même si la classe statique hérite de "classe d'objet", elle n'hérite que de deux méthodes statiques de la classe "d'objet".

D'autres classes non statiques héritent des quatre autres méthodes.

0
Syed

Si vous essayez d'empêcher les utilisateurs de créer des instances de la classe, ajoutez simplement un constructeur par défaut privé.

0
Mark Rendle

Comme indiqué dans une autre réponse, le message du compilateur est confus mais correct. Tu peux écrire:

static class A : object
{
}

bien sûr, il n'est pas vraiment utile de déclarer explicitement cet héritage, mais l'héritage lui-même est réellement utile dans le cadre lorsque vous redéfinissez les membres virtuels de l'objet:

    static class A : object
    {
        public static new string ToString()
        {
            return "I am object A";
        }

        public static new int GetHashCode()
        {
            return ToString().GetHashCode();
        }
    }
0
Julien

Est-ce que toutes les classes (y compris statique) ne dérivent pas déjà d'objet? Comme dans, par défaut?

En outre, comme il est dit, "La classe statique ne peut pas dériver du type.", Donc je ne pense pas que ce que vous faites soit possible. Pourquoi voudriez-vous qu'une classe statique dérive d'un type de toute façon?

0
Svish

Ça ne peut pas. Vous devez créer une classe normale dérivant d'une autre classe.

0
Grzenio

Toutes les classes dérivent implicitement de Object. Cela dit, bien que les classes statiques (qui, par définition, ne soient que des conteneurs pour des membres statiques) "dérivent" à partir d'objet, vous ne pouvez rien en tirer.

0
Anton Gogolev

Le message d'erreur est trompeur.

bar ne peut pas hériter de foo parce que foo peut être instancié et que bar ne peut pas.

0
teedyay