请问一下 “C# 父类的静态方法可以被子类的静态方法覆盖”这句话对吗?
答案:2 悬赏:50 手机版
解决时间 2021-03-09 11:42
- 提问者网友:绫月
- 2021-03-08 16:12
请问一下 “C# 父类的静态方法可以被子类的静态方法覆盖”这句话对吗?
最佳答案
- 五星知识达人网友:狂恋
- 2021-03-08 16:46
基类静态方法不能被子类继承,所以不存在覆盖的说法
故“C# 父类的静态方法可以被子类的静态方法覆盖”是错的
故“C# 父类的静态方法可以被子类的静态方法覆盖”是错的
全部回答
- 1楼网友:逐風
- 2021-03-08 17:46
# 对方法的重载必须要显式声明,这个与 c++ 和 java 都不同。见下面的 c# 程序:
class plane
{
public double topspeed()
{
return 300.0d;
}
}
class jet : plane
{
public double topspeed()
{
return 900.0d;
}
}
class airport : ientrypoint
{
public void main()
{
plane plane = new jet();
console.writeline("planes top speed: {0}", plane.topspeed());
}
}
上面的程序很简单,在编译时会有警告:警告:“jet.topspeed()隐藏了继承的成员plane.topspeed()。如果是有意隐藏,请使用关键字 new。"e:\visualstudioproj\chouytest\learningcsharpbyexample\io\readfile.cs 92 17 learningcsharpbyexample
但结果却出乎意料地是:
planes top speed: 300
很显然,它并没有调用子类的 topspeed 方法。原因是在 c# 中,方法如果想要被重载,必须显式地声明为 virtual,也就是虚方法。而继承类如果要重写此方法时,也必须显式地声明为 override ,这样才能覆盖父类方法。c# 代码如下:
class plane
{
public virtual double topspeed()
{
return 300.0d;
}
}
class jet : plane
{
public override double topspeed()
{
return 900.0d;
}
}
class airport : ientrypoint
{
public void main()
{
plane plane = new jet();
console.writeline("planes top speed: {0}", plane.topspeed());
}
}以上程序的输出结果是:
planes top speed: 900
在 c# 中,如果一个方法允许子类覆盖,则必须要显式声明为 virtual 的(在 java 中,默认是 virtual 的),并且在子类里必须显式声明为 override。这两个关键子哪个也不能省。顺便再说一下另外的三个关键字:sealed、abstract、new。
在继承 abstract 类的 abstract 方法时,也必须声明方法为 override,abstract 方法的特性与 java 中的抽象类是一样的。sealed 关键字意思是密封的,相当于 java 中的 final,在类上使用是不可再被继承,在方法上使用是不可再覆盖;但还有一个例外,就是对方法使用 new 关键字声明。代码如下:
abstract class plane
{
public virtual double topspeed()
{
return 300.0d;
}
}
class jet : plane
{
public sealed override double topspeed()
{
return 900.0d;
}
}
class ufo : jet
{
public new double topspeed()
{
return 13000.0d;
}
}
class airport : ientrypoint
{
public void entrypoint()
{
ufo plane = new ufo();
console.writeline("planes top speed: {0}", ((plane) plane).topspeed());
console.writeline("planes top speed: {0}", ((jet) plane).topspeed());
console.writeline("planes top speed: {0}", ((ufo) plane).topspeed());
}
}注意,我是把 ufo 对象强转成某一对象然后调用其 topspeed 方法的,上面程序的输出结果是:
planes top speed: 900
planes top speed: 900
planes top speed: 13000
总之:c# 在这方面增加了方法定义的灵活性,给用户的更大的权利。但用不好会出现比较奇怪的结果。所以我觉得在定义方法时全部都加上 sealed 或是 virtual 关键字,这样避免继承的类出错.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯