public virtual string name()
{
return IdenToken; }
==》public override string name()
{
return IdenToken; }
==》public override string name()
解决方案 »
- XML Schema 到底怎么学啊?
- 如何获得ushort类型的高8位和低8位字节 有没有函数实现?
- picturebox加载图片的问题,在线等,解决就结贴
- winform 窗体设计如何做到自适应
- 为什么devexpress 的 grid控件,无法用代码选中一行?(当grid的MultiSelect = false时)?
- 正则表达式
- 面试的时候问并发性处理,如何回答。
- 动态改变数据类型 (C#)
- gridview 如何通过一个按钮实现隐藏列,显示列的功能且能够通过程序取到隐藏后列的值
- 一个简单的问题,请大家帮帮忙
- 类在不同解决方案的调试问题
- 怎么在项目中,导入自定义的windows control library?
2、你在IdentifierToken中定义了private string IdenToken;
3、由于以上两个步骤你定义的都是私有变量,因此当修改子类的变量时,你不会修改父类的变量;但是以上并不是主要原因,更主要的是:
IdentifierToken variable = new IdentifierToken("Variale");
虽然是生成了一个IdentifierToken的对象,但是,同时通过base()调用了父类的构造函数,当把IdentifierToken对象传入Method函数时,进行了转换,即转换为了父类Token。因此此时当调用name()属性时,调用的就是Token的了。你这样的设计是有问题的。
如果你坚持你这样的设计,那么你可以做如下的修改:1、修改或增加Token的构造函数:
public Token()
{
test = "Hello world";
}
public Token(string test)
{
test = test;
}
2、修改IdentifierToken的构造函数
public IdentifierToken(string Iden) :base(Iden)
{
IdenToken = Iden;
}
这样就可以修改Token的test的值了。
当然,这并非是最好的设计。
public static void Method(Token t)
{
Console.WriteLine(t.name());
}
的时候这个name就是Token 类的name属性,而不是IdentifierToken的,要返回为Variale请改IdentifierToken 中对属性name的定义为:
new public virtual string name()
{
return IdenToken; }
或是new public string name()
{
return IdenToken;}
public virtual string name()
{
return IdenToken; }
改为
public override string name()
{
return IdenToken; }
即可
1。shanyou同志的这个程序很好的说明了方法的重写与隐藏问题。程序中,派生类IdentifierToken的name方法将她的基类的同名(相同签名)方法隐藏了(不是重写)
然而,在Method方法中,程序又将IdentifierToken的对象转换成其基类Token的对象,
这样,当调用参数t的name方法时,将会按照变量t的类型判断将调用哪个类的name方法,
而不是根据变量t所引用的对象的实际类型来调用(这里t所引用的对象是IdentifierToken
的对象variable)。所以就造成了输出"Hello world"的
结果。
2。解决这个问题又很多方法,比如象大家说的那样,将virtual 该成override 。但是象
jerryfangsh(碎片) 的方法有点复杂,而且很危险,因为,他(她)是通过改变Token类中
私有变量test的方法,来改变输出,而且这好象和我们讨论的多态没什么关系。他(她)
还有一个笔误:
public Token(string test)
{
test = test;
}=》 public Token(string test)
{
this.test = test;
}