gpt4 book ai didi

c# - abstract new/virtual/override/abstract 关键字的一些现实示例是什么?

转载 作者:行者123 更新时间:2023-11-30 19:04:14 33 4
gpt4 key购买 nike

我正在从 PHP 转向 C#。

在 PHP 中,使用抽象类创建“级联覆盖”模式简单直接,基本上“基类方法将处理它,除非继承类有具有相同签名的方法”。

然而,在 C# 中,我只花了大约 20 分钟尝试关键字 newvirtualabstract 和 < strong>override baseinheriting 类,直到我最终得到正确的组合来执行这个简单的级联覆盖模式。

因此即使下面的代码按照我想要的方式工作,这些添加的关键字向我表明 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.";
}
}

}

最佳答案

virtual/override是核心多态对;听起来你已经破解了这些

abstract就像virtual ,但是没有合理的基础实现;用例:可能是 Stream ,在实际实现中需要对字节做一些事情。这迫使类(class)成为abstract

new通常应该避免;它破坏了多态性……最常见的情况是使用更具体的签名/返回类型重新公开(可能在密封类中,因为它不会在链上变得更漂亮……)-参见 SqlConnection.CreateCommand (与 DbConnection.CreateCommand 相比),或(也许更值得注意) IEnumerator<T>.Current (与 IEnumerator.Current 相比)

关于c# - abstract new/virtual/override/abstract 关键字的一些现实示例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1000209/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com