【发布时间】:2009-06-24 06:30:39
【问题描述】:
我正在从 PHP 迁移到 C#。
在 PHP 中,使用抽象类来创建“级联覆盖”模式非常简单明了,基本上“基类方法会处理它,除非继承类有具有相同签名的方法”。
然而,在 C# 中,我只花了大约 20 分钟尝试了关键字 new、virtual、abstract 和 abstract 的各种组合base 和 inheriting 类中的 strong>override 直到我最终得到正确的组合来执行这种简单的级联覆盖模式。
所以即使下面的代码按照我想要的方式工作,这些添加的关键字也向我表明 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.";
}
}
}
【问题讨论】:
-
这里有一些关于(罕见)情况的注释,在这些情况下,人们可能想要使用“新”来进行方法隐藏。 blogs.msdn.com/ericlippert/archive/2008/05/21/…
标签: c# abstract-class