Pourquoi utilisons-nous le virtuel et la remplacer?
Pourquoi utilisons-nous remplacer et virtuelle si elle donne le même effet lorsque nous ne pas utiliser de remplacement et virtuel?
exemple 1:
class BaseClass
{
public virtual string call()
{
return "A";
}
}
class DerivedClass : BaseClass
{
public override string call()
{
return "B";
}
}
de sortie : B
Exemple 2:
class BaseClass
{
public string call()
{
return "A";
}
}
class DerivedClass : BaseClass
{
public string call()
{
return "B";
}
}
et le résultat est toujours le même:
de sortie : B
pour exécuter le test:
class Program
{
static void Main(string[] args)
{
DerivedClass dc = new DerivedClass();
Console.WriteLine(dc.call());
Console.ReadKey();
}
}
Ne le compilateur ajouter virtuel et remplacer automatiquement au moment de la compilation?
Je serais heureux si quelqu'un pouvait m'expliquer la raison de l'utilisation de virtual et override.
Vous obtiendrez un résultat différent si tu peux derivedClass de la classe de base avant d'appeler ajouter: 1 => 2 et 2 => 1
il n'y a pas de doublon, son sujet de la "la priorité et virtuel"
il serait vraiment beaucoup plus agréable à publier des exemples.... compilé.
Bien que la question est un peu différente, c'est le même principe. Vous êtes juste de l'incompréhension de la différence entre le polymorphisme et la méthode de masquage.
Votre test (évidemment) ne permet pas de démontrer la différence. Modifiez la ligne "BaseClass dc = new DerivedClass();" et essayez à nouveau. Maintenant, est-il une différence?
il n'y a pas de doublon, son sujet de la "la priorité et virtuel"
il serait vraiment beaucoup plus agréable à publier des exemples.... compilé.
Bien que la question est un peu différente, c'est le même principe. Vous êtes juste de l'incompréhension de la différence entre le polymorphisme et la méthode de masquage.
Votre test (évidemment) ne permet pas de démontrer la différence. Modifiez la ligne "BaseClass dc = new DerivedClass();" et essayez à nouveau. Maintenant, est-il une différence?
OriginalL'auteur Racooon | 2011-10-24
Vous devez vous connecter pour publier un commentaire.
(remarque, je suis tranquillement en ignorant les erreurs de compilation)
Maintenant faire:
Sans
virtual
, cette impression seraA
, alors qu'en réalité, unDerivedClass
doit être écritB
. C'est parce qu'il a simplement appelé leBaseClass
de mise en œuvre (depuisobj
est typé commeBaseClass
, et pas de polymorphisme est défini).Il imprime le même, et il n'importe pas si vous utilisez de remplacement et virtuel. Je pense que le compilateur ajoute au moment de la compilation.
examiner très attentivement à la différence entre le scénario et le vôtre. Maintenant, modifiez votre code pour
BaseClass bc = new DerivedClass(); Console.WriteLine(bc.call());
. À souligner: non pas ajouter automatiquement au moment de la compilation; simplement, vous souhaitez tester quelque chose de différent.parce que c'est moment. Si vous n'utilisez pas de polymorphisme, alors oui: ils montrent la même chose. La différence est que
virtual
prend en charge l'abstraction et de la substitution. Vous demandez: "pourquoi utilisons-nous {ces}" - et je le dis: à l'appui de ce scénario. Un grand nombre de fois, nous ne savons pas le de béton/type final - nous savons seulement que la base de type. Par exemple, unControl
en winforms, ou unPage
dans ASP.NET.que serait l'intégralité de la pierre angulaire de polymorphisme. Exemple de base: vous avez une classe et que vous souhaitez modifier le texte de la représentation (remplacer
ToString()
) ou comment l'égalité des œuvres (remplacerEquals()
etGetHashCode()
). Exemple plus complexe: vous êtes à la mise en œuvre d'un personnalisé ADO.NET fournisseur, de sorte que vous sous-classeDbConnection
,DbParameter
,DbDataReader
etc et remplacer les différentes méthodes pour ajouter votre mise en œuvre.OriginalL'auteur Marc Gravell
Virtuel et remplacer sont à la base du mécanisme de l'héritage en programmation orientée objet.
C'est peut-être la chose la plus importante à comprendre lorsque vous utilisez des classes dans un langage comme C# ou Java.
http://en.wikipedia.org/wiki/Inheritance_(objet oriented_programming)
L'héritage permet de réutiliser le code de l'ajout de nouveaux champs, de propriétés et de méthodes ou de remplacer les méthodes et les propriétés de définir auparavant les classes.
Virtuel et Remplacer permet de remplacer le contenu d'une méthode, et quand je dis de remplacer, je te le remplacer.
Je voudrais vous proposer un bel exemple.
Si vous omettez le virtuel et la remplacer, MyClassItalian affichera "Bonjour!" et pas "Ciao!".
Dans votre exemple vous afficher un Ombrage de la technique, mais le compilateur devrait vous donner un avertissement.
Vous shoul ajouter le "nouveau" mot clé si vous souhaitez masquer une méthode dans une classe de base.
Le masquage d'une méthode n'est pas primordial! Est juste de se cacher.
Une utilisation possible qui vient à l'esprit est qu'il peut être utilisé lorsque vous avez besoin d'un certain type d'optimisation, par exemple.
Maintenant...
Vous pouvez utiliser MySpecialListBase dans tout votre code, et lorsque vous appelez la fonction Count() il va appeler la méthode virtuelle GetCount().
Mais si vous utilisez seulement MySpecialArrayList il va appeler l'optimisation de la fonction Count() qui n'est pas du virtuel et que le juste retour d'un champ, l'augmentation des performances.
OriginalL'auteur Salvatore Previti
Meilleur exemple que je peux penser de cela est utile lorsque vous créez votre propre objet(classe) et vous devez l'ajouter à une liste de cet objet à une zone de liste déroulante.
Lorsque vous ajoutez votre objet dans la zone de liste déroulante, vous voulez être en mesure de contrôler ce que le texte est affiché pour chaque élément. Objet.toString est une méthode virtuelle. http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx et à cause de cela, vous pouvez remplacer cette méthode et de définir .toString pour afficher les informations correctes au sujet de votre objet en la remplaçant.
OriginalL'auteur Gage
La Redéfinition De Méthode:
Où vous définir ou mettre en œuvre une méthode virtuelle dans une classe parente, puis de la remplacer dans une classe descendante.
Lorsque vous décidez de déclarer une méthode virtuelle, vous donnant la permission de classes dérivées pour étendre et redéfinir la méthode avec leur propre mise en œuvre. Vous pouvez avoir la prolongation de l'appel de la méthode la méthode parent du code de trop.
Dans la plupart des langages à objets, vous pouvez également choisir de masquer une méthode parent. Lorsque vous introduisez une nouvelle mise en œuvre du même nom de méthode avec la même signature sans écraser, vous vous cachez de la méthode parent.
C# Primordial
En C#, vous pouvez spécifier une méthode virtuelle avec le mot clé virtual dans une classe parente, et d'étendre (ou remplacer) dans un descendant de la classe en utilisant le mot-clé override.
Utiliser le mot clé base en descendant méthode à exécuter le code dans la méthode parent, c'est à dire de la base.SomeMethod().
Exemple De Syntaxe:
Remplacer Détails
Vous ne pouvez pas remplacer une non-méthode virtuelle, ni une méthode statique.
La première version de la méthode parent doit être virtuelle ou abstraite.
Vous pouvez remplacer n'importe quel parent méthode marqué virtuel, abstrait, ou de la remplacer (déjà remplacé).
Les méthodes doivent avoir la même signature.
Les méthodes doivent avoir la même visibilité (le même niveau d'accès).
Utilisez le mot clé base de référence à la classe parent comme dans la base.SomeMethod().
C# Override Exemple
L'extrait de code suivant illustre l'utilisation de virtuel et de remplacer de remplacer un parent méthode dans une classe descendante.
Cacher une Méthode avec de Nouveaux
Utiliser le mot clé new pour introduire une nouvelle mise en œuvre d'une méthode parent (ce qui permet de masquer la méthode parent). Vous pouvez masquer une méthode sans utiliser de nouveau, mais vous obtiendrez un avertissement du compilateur. À l'aide de nouveau va supprimer l'avertissement.
La nouvelle et remplacer les modificateurs ont des significations différentes. Le nouveau modificateur crée un nouveau membre avec le même nom, la signature et à la visibilité et cache le membre d'origine. Remplacer le modificateur s'étend de la mise en œuvre d'un membre hérité et permet de mettre en oeuvre l'héritage-polymorphisme basé sur l'.
Éviter d'Introduire de Nouveaux Membres: Parfois il y a des raisons claires pour introduire une nouvelle méthode avec le même nom, la signature et la visibilité d'une méthode parent. Dans les cas clairs, l'introduction d'un nouveau membre est une fonction puissante. Toutefois, si vous n'avez pas de raison claire, puis éviter d'introduire une nouvelle version de la méthode est le nom de la nouvelle méthode de quelque chose d'unique et approprié.
L'appel de la Classe de Base de la Version
Une tâche commune À la OO est d'étendre une méthode par la première exécution de la méthode parent code, puis l'ajout de code. Utilisez le mot clé base de référence à la classe parent comme dans la base.SomeMethod().
OriginalL'auteur Enigma State