PHPからC#に移行しています。
PHPでは、抽象クラスを使用して「カスケードオーバーライド」パターンを作成するのは簡単で簡単でした。基本的に、「継承クラスに同じシグネチャを持つメソッドがない限り、基本クラスのメソッドがそれを処理します」。
ただし、C#では、基本クラスと継承クラスでキーワードnew、virtual、abstract、overrideのさまざまな組み合わせを試して、この単純なカスケードオーバーライドパターンを実行する正しい組み合わせが最終的に得られるまで、約20分を費やしました。
したがって、以下のコードが私が望むように機能する場合でも、これらの追加されたキーワードは、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.";
}
}
}