我正在从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