【发布时间】:2018-07-05 17:28:31
【问题描述】:
在这段代码中:
using System;
namespace ConsoleApp1
{
public class TextInput
{
protected string _text = "";
public void Add(char c)
{
_text += c;
}
public string GetValue()
{
return _text;
}
}
public class NumericInput : TextInput
{
public new void Add(char c)
{
if (!char.IsDigit(c)) return;
_text += c;
}
}
public class Program
{
public static void Main(string[] args)
{
TextInput input = new NumericInput();
input.Add('1');
input.Add('a');
input.Add('0');
Console.WriteLine(input.GetValue());
Console.WriteLine(char.IsDigit('1'));
Console.WriteLine(char.IsDigit('a'));
Console.WriteLine(char.IsDigit('0'));
}
}
}
...调用Console.WriteLine(char.IsDigit('a')); 正确返回False,但在被覆盖的Add 方法中它总是返回True。
显然它调用TextInput.Add() 而不是NumericInput.Add()。这可以在覆盖的Add() 方法中更正吗? Main 中的代码可能不会更改!
【问题讨论】:
-
将
Add设为虚拟并用override关键字覆盖它 -
@AleksAndreev 在这种情况下这是唯一可能的选择吗?
-
您能解释一下您为什么使用新关键字吗?如果您试图实现方法覆盖。第二件事,在这里您正在创建基类
TextInput的实例并调用Add(),执行不会进入派生类中存在的方法,不会检查IsDigit()条件。请给我们一些有效的例子 -
这是您的示例的输出:dotnetfiddle.net/J9Xjon
-
我认为这个答案会有很大帮助:stackoverflow.com/a/3838692/6300600
标签: c# inheritance char