Question

Quelle est la différence entre la cachette de méthode et l'observation en C #? Sont-ils identiques ou différents? Pouvons-nous les appeler comme le polymorphisme (temps de compilation ou temps d'exécution)?

Était-ce utile?

La solution

Quelle est la différence entre la cachette de méthode et l'observation en C #?

L'observation est un autre terme couramment utilisé pour se cacher. La spécification C # utilise uniquement la "cachette" mais est acceptable.

Vous appelez juste la «méthode cachée», mais il existe des formes de cachette autre que la cachette de méthode. Par exemple:

namespace N
{   
    class D {}
    class C 
    {
        class N
        {
            class D
            {
                 N.D nd; // Which N.D does this refer to?

La classe imbriquée n masque l'espace de noms n à l'intérieur D.

Pouvons-nous les appeler comme le polymorphisme (temps de compilation ou temps d'exécution)?

La cachette de méthode peut être utilisée pour le polymorphisme, oui. Vous pouvez même mélanger la méthode cachée avec la méthode remplacée; Il est légal d'introduire une nouvelle méthode virtuelle en cachant une ancienne méthode virtuelle; Dans ce cas, quelle méthode virtuelle est choisie dépend du temps de compilation et type d'exécution du récepteur. Faire cela est très déroutant et vous devez l'éviter si possible.

Autres conseils

Le compilateur VB.NET l'appelle l'observation, en C #, il est appelé cachette. L'appeler l'observation en C # est un déversement de VB.

Et c'est un avertissement de compilateur AA, il est essentiellement un conflit de nom entre la base et la classe dérivée.

Pouvons-nous les appeler comme le polymorphisme (temps de compilation ou temps d'exécution)?

Ce n'est certainement pas une forme de polymorphisme d'exécution. Un appel à une cachette ou à une méthode cachée est résolu au moment de la compilation. Ce qui fait qu'il ne sera en général pas appelé ou considéré le polymorphisme.

Les deux termes signifient la même chose en C #.

Méthode cachée == shombe.

Vous pouvez l'utiliser comme une forme de polymorphisme - lorsque vous ne voulez pas que la méthode de la classe de base soit visible / utilisable via la classe héritée.

Une méthode d'observation est complètement découplée à partir de la classe de base - c'est une nouvelle méthode. Le terme cachette est utilisé car il a une signature identique à celui de la classe de base et le «cache» - il brise la chaîne d'héritage.

Nom cachette de C # (new modificateur) est appelé ombrage dans vb.net (mot-clé Shadows).

Cela peut être considéré comme polymorphisme Ce n'est que dans le sens où l'emprise est un "polymorphisme", c'est-à-dire statique ou compilé. Il est ne pas Un polymorphisme dans le sens classique d'appeler les fonctions virtuelles.

Ce ne sont que deux mots différents pour la même chose, mais diffèrent dans le contexte où vous les utilisez le plus souvent. En règle générale, ce qu'on appelle la «cachette» est lié au polymorphisme, mais ce qu'on appelle «l'observation» ne l'est pas.

Dans le langage C #, lorsque vous dites "vous cacher", vous parlez généralement de l'héritage, où une méthode plus dérivée "cache" une méthode de classe de base à partir de la chaîne d'appels de méthode héritée normale.

Lorsque vous dites "Shadow", vous parlez généralement de portée: un identifiant dans une portée intérieure est "d'observer" un identifiant à une portée plus élevée. Dans d'autres langues, ce qu'on appelle la «cachette» en C # est parfois appelée «ombrage».

Les deux sont des concepts de temps de compilation; Ils décrivent quel objet un identifiant donné se réfère dans un contexte donné lorsque le compilateur va le lier.

public class A
{
  public int B;
  public void C()
  {
    return this.B;
  }
}

public class D : A
{
  public int X;

  public new void C()
  {
    var X = 1.0m;
    return X;
  }
}

Méthode D.C() Méthode "cache" A.C(); Normalement, un appel à D.C() appellerait toujours dans les classes de base A.C() Méthode, puisque ce n'est pas virtual. Nous ne voulons pas ça; nous voulons D.C(). Évidemment, c'est quelque chose que vous devriez essayer d'éviter, car c'est déroutant, surtout si vous démarrez vos D à A, mais il existe si vous en avez besoin. Notez également que la méthode cachée est automatique: sans le new mot-clé ici, D.C() se cache toujours A.C() Mais nous obtenons un avertissement parce que d'habitude Ce n'est pas ce que vous voulez. La new Le mot-clé indique clairement que c'est vraiment ce que nous voulons.

Variable locale X dans D.C() membre de la classe Shadows D.X dans le cadre de D.C() seulement. Dans ce cas, il y a deux choses dans la portée qui pourraient légitimement être appelées X Et le compilateur a besoin de règles pour lui dire laquelle vous voulez dire. Le "plus local" X ombres le "moins local" D.X C'est donc ce que nous obtenons.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top