私はPHPからC#に移行しています。抽象的な新規/仮想/上書き/抽象キーワードの実際の例は何ですか?
PHPで継承クラスは、同じシグネチャを持つメソッドを持っていない限り、基本的に「基底クラスのメソッドは、それの世話をする、「カスケードオーバーライド」パターンを作成するために、抽象クラスを使用するのは簡単で分かりました" C#ので
が、しかし、私はちょうどキーワードの様々な組み合わせを試し、約20分を費やし新しい、クラスを継承 仮想、 抽象、および ベースで オーバーライドと Iまで最終的に、このシンプルなカスケードオーバーライドパターンを実行する適切な組み合わせを得ました。したがって、以下のコードも私が望むように動作しますが、これらの追加されたキーワードは、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.";
}
}
}
ここでは、メソッドの隠蔽を行うために「新規」を使用する(まれな)状況に関する注意事項をいくつか示します。 http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx –