Je passe de PHP à C#.Quels sont les exemples concrets de mots clés abstraits nouveaux/virtuels/overrides/abstraits?
En PHP, il est simple et facile à utiliser des classes abstraites pour créer un motif « cascade override », essentiellement "la méthode de classe de base prendra soin à moins que la classe héritant a une méthode avec la même signature ".
En C#, cependant, je viens de passer environ 20 minutes d'essayer diverses combinaisons des mots-clés nouvelle, virtuel, abstrait et override dans la base et héritant cours jusqu'à ce que je a finalement obtenu la bonne combinaison qui fait ce simple modèle de priorité en cascade.
Donc, même si le code ci-dessous fonctionne comme je le veux, ces mots-clés ajoutés me suggèrent que C# peut faire beaucoup plus avec les classes abstraites. J'ai recherché des exemples de ces mots-clés et comprendre fondamentalement ce qu'ils font, mais je ne peux toujours pas imaginer un scénario réel dans lequel je les utiliserais autre que ce simple modèle de "cascade". Quels sont certains monde réel manières dont vous implémentez ces mots-clés dans votre programmation au jour le jour?
Codequi fonctionne:
using System;
namespace TestOverride23433
{
public class Program
{
static void Main(string[] args)
{
string[] dataTypeIdCodes = { "line", "wn" };
for (int index = 0; index < dataTypeIdCodes.Length; index++)
{
DataType dataType = DataType.Create(dataTypeIdCodes[index]);
Console.WriteLine(dataType.GetBuildItemBlock());
}
Console.ReadLine();
}
}
public abstract class DataType
{
public static DataType Create(string dataTypeIdCode)
{
switch (dataTypeIdCode)
{
case "line":
return new DataTypeLine();
case "wn":
return new DataTypeWholeNumber();
default:
return null;
}
}
//must be defined as virtual
public virtual string GetBuildItemBlock()
{
return "GetBuildItemBlock executed in the default datatype class";
}
}
public class DataTypeLine : DataType
{
public DataTypeLine()
{
Console.WriteLine("DataTypeLine just created.");
}
}
public class DataTypeWholeNumber : DataType
{
public DataTypeWholeNumber()
{
Console.WriteLine("DataTypeWholeNumber just created.");
}
//new public override string GetBuildItemBlock() //base method is erroneously executed
//public override string GetBuildItemBlock() //gets error "cannot override inherited member because it is not marked virtual, abstract, or override"
public override string GetBuildItemBlock()
{
return "GetBuildItemBlock executed in the WHOLENUMBER class.";
}
}
}
Voici quelques remarques sur les situations (rares) dans lesquelles on pourrait vouloir utiliser "nouveau" pour faire une dissimulation de méthode. http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx –