Interet des fonctions virtuelles

Contenu du snippet

voici un petit exemple de code montrant l'intérêt des fonctions virtuelles.
J'ai supposé que les garcons etaient pas tres bon en chant, et les filles en sport.. ce n'est qu'une supposition bien entendu ;)
C'est ma premiere source: soyez indulgent ;)

Source / Exemple :


using System;

class Eleve
{
	// la classe eleve definira un eleve
	// avec son nom, sa note de sport,
	// et sa note de chant.
	// a priori les filles sont moins fortes en sport
	// et les garcons en chant. On va les aider un peu..
	public Eleve(string name, float sportnote, float chantnote)
	{
		this.name=name;
		this.sportnote=sportnote;
		this.chantnote=chantnote;
}
	public float SportNote()
	{
		return (sportnote);
	}
	
	public float ChantNote()
	{
		return (chantnote);
	}
	
	virtual public float VirtualSportNote()
	{
		return (sportnote);
	}
	
	virtual public float VirtualChantNote()
	{
		return (chantnote);
	}
	public string Name()
	{
		return name;
	}
	
	private string name;
	protected float sportnote;
	protected  float chantnote;
}

class Garcon : Eleve
{
	public Garcon(string name,float sportnote, float chantnote) : base(name, sportnote, chantnote)
	{
	}
	
	// on va aider les garcons en chant
	// en multipliant leur note par 1.5
	public new float ChantNote() 
	{
		if (1.5F*chantnote<20.0F)
			return (1.5F*chantnote);
		else
			return (20.0F);
	}
	
	// meme fonction que precedemment
	//mais en surchangeant la virtuelle
	override public float VirtualChantNote()
	{
		if (1.5F*chantnote<20.0F)
			return (1.5F*chantnote);
		else
			return (20.0F);		
	}
}

class Fille : Eleve
{
	public Fille(string name,float sportnote, float chantnote) : base(name, sportnote, chantnote)
	{
	}
	
	// on va aider les filles en sport
	// en multipliant leur note par 1.5
	public new float SportNote()
	{
		if (1.5F*sportnote<20.0F)
			return (1.5F*sportnote);
		else
			return (20.0F);
	}
	
	// meme fonction que precedemment
	//mais en surchangeant la virtuelle
	override public float VirtualSportNote()
	{
		if (1.5F*sportnote<20.0F)
			return (1.5F*sportnote);
		else
			return (20.0F);		
	}
}

class MainClass
{
	public static void Main(string[] args)
	{
		Garcon david = new Garcon("david", 10,10);
		Fille sophie = new Fille ("Sophie", 10,10);
		Console.WriteLine("Premier essai - Eleves affichés 1 à 1");
		Console.WriteLine("nom = {0}  Note de Sport = {1}  Note de Chant = {2}", david.Name(), david.SportNote(), david.ChantNote());
		Console.WriteLine("nom = {0}  Note de Sport = {1}  Note de Chant = {2}", sophie.Name(), sophie.SportNote(), sophie.ChantNote());
		
		// maintenant on crée un tableau 
		// necessaire quand on a bcp d'eleves
		Eleve[] eleves=new Eleve[2];
		// les eleves perdent leur sexe en entrant de le tableau
		eleves[0]=david;
		eleves[1]=sophie;
		Console.WriteLine();
		Console.WriteLine("Second Esssai - Eleves du tableau avec les fonctions new");
		// si on affiche les notes, les filles et garcons ne seront plus aidés
		foreach (Eleve eleve in eleves)
		{
			Console.WriteLine("nom = {0}  Note de Sport = {1}  Note de Chant = {2}", eleve.Name(), eleve.SportNote(), eleve.ChantNote());
		}
		//la solution est d'utiliser les fonctions virtuelles:
		Console.WriteLine();
		Console.WriteLine("Troisieme essai - Eleves du tableau avec les fonctions virtuelles");
		foreach (Eleve eleve in eleves)
		{
			Console.WriteLine("nom = {0}  Note de Sport = {1}  Note de Chant = {2}", eleve.Name(), eleve.VirtualSportNote(), eleve.VirtualChantNote());
		}
		//cette fois les garcons et les filles
		// retrouvent leurs avantages respectifs.
	}
}

Conclusion :


contactez moi si bug

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.