我正在從PHP轉向C#。什麼是抽象的新/虛擬/覆蓋/抽象關鍵字的一些真實世界的例子?
在PHP是簡單和直接使用抽象類來創建一個「級聯倍率」圖案,基本上「基類方法將照顧它,除非該繼承類的具有相同簽名方法」。
在C#中,但我只花了大約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.";
}
}
}
下面是關於(罕見)情況的一些說明,其中人們可能想要使用「新」進行方法隱藏。 http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx – 2009-06-16 15:20:29