Я перехожу с PHP на C #.
В PHP было просто и понятно использовать абстрактные классы для создания шаблона " каскадного переопределения ", в основном ", метод базового класса позаботится об этом, если только у наследующего класса нет метода с такой же подписью".
В C #, однако, я потратил около 20 минут, пытаясь найти различные комбинации ключевых слов new , virtual , abstract и override в base и , наследующих классы , пока я, наконец, не получил правильную комбинацию, которая выполняет этот простой каскадный шаблон переопределения.
Так что даже те, которые приведены ниже, работают так, как я хочу, эти добавленные ключевые слова подсказывают мне, что C # может делать гораздо больше с абстрактными классами. Я посмотрел примеры этих ключевых слов и в основном понимаю, что они делают, но все еще не могу представить реальный сценарий, в котором я бы использовал их, кроме этого простого шаблона «каскадного переопределения». Каким образом в реальном мире способов реализации этих ключевых слов в повседневном программировании?
код, который работает:
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.";
}
}
}