搞不明白的几个关键字!

hetengfei_ 2012-03-05 12:00:04

《1》两个虚假的东西 virtual abstract一般选用 virtual 没有用上abstract

《2》两个重写的区别 override new (我应该用那一个,我只会从中随便选一个来用,一般选 override

不知大家 能不能举例说说 自已是如何用 这两组东东的?
...全文
2562 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2012-03-14
  • 打赏
  • 举报
回复
to 3#
override 与可以重写virtual.
首选abstract必须被重写,也就是继承了就必须重写 所以怎么会出现没有就用new 的说法的。

所以这里的new 是对 virtual方法而言的,只是对象全新的,不表现多态的说明


//在公司上网,不方便,只能手写代码 大概如下
class Program
{
static void Main(){
Base a=new A();
Base b=new B();
a.Work();
b.Work();

A a1=new A();
a1.Work();
Console.Read();
}
}

public class Base{
public virtual void Work{Console.WriteLine("Base Write...")}
}

public class A:Base{
public new void Work(){Console.WriteLine("A Wirte ...New");}
}

public class B:Base{
public override void Work(){Console.WriteLine("A Wirte... override");}
}
sinitek123 2012-03-14
  • 打赏
  • 举报
回复
88楼
gw6328 2012-03-14
  • 打赏
  • 举报
回复
virtual是虚方法 可以有实现,也可以被子类重写
abstract是抽象的方法 不能有实现,只能通过重写

new 与override
override就是重写virtual的关键字,可以表现出多态,多态是面象对的编程的一部他
而new就是不表现多态的部份,从字面意思上理解也就是全是新的,是你写的子类的全新方法,也父类没有关系 。
cnmweizhou 2012-03-12
  • 打赏
  • 举报
回复
好总是
wq34762707 2012-03-12
  • 打赏
  • 举报
回复
2楼强大,3楼经典!!
leichentao094 2012-03-12
  • 打赏
  • 举报
回复
深奥!
贝壳里的鱼 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 abbey 的回复:]

virtual:有了缺省方法了,你爱改不改。
abstract:你必须自己搞一套。

override:要找就来找我
new:我要把你们都遮了
[/Quote]

这个真精辟!
xuelang1225 2012-03-09
  • 打赏
  • 举报
回复
到MSDN输入你所要了解的东西,看一下文档自己思考一下,自然弄清自己的疑问。
愚知 2012-03-09
  • 打赏
  • 举报
回复
解释的可能另类些,请包涵。
1、 virtual 虚则实之
2、 abstract 大而化之
[Quote=引用 75 楼 hetengfei_ 的回复:]
引用 72 楼 yuan521929 的回复:
你的头像让我丧失了回答的勇气。

只是一个图片,处理一下的图片,你也可以搞成这样啊。

我还是想听听你的看法, 谢谢!
[/Quote]
hetengfei_ 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 72 楼 yuan521929 的回复:]
你的头像让我丧失了回答的勇气。
[/Quote]
只是一个图片,处理一下的图片,你也可以搞成这样啊。

我还是想听听你的看法, 谢谢!
hqyaohappy 2012-03-09
  • 打赏
  • 举报
回复
virtual:如果对父类定义了这样的方法,那么此方法就是虚方法,如果在子类中想重写此方法,可以用override。
abstract:修饰的类是抽象类,修饰的方法是抽象方法。抽象类中可以定义抽象方法,也可以定义普通方法,但是定义的抽象方法必须在子类中进行重写,否则会报错。

override是对父类方法的重写。而new是方法隐藏,此关键字可要可不要。如果在父类中有个方法,在子类中也有一个一模一样方法并且用new修饰,当实例化时,比如:
Person p=new Student();
p.work();
此时这个方法调用的是父类的方法不是子类的方法。
愚知 2012-03-09
  • 打赏
  • 举报
回复
你的头像让我丧失了回答的勇气。
[Quote=引用 70 楼 hetengfei_ 的回复:]
几天后,想起贴子的第二个问题,
再次阐述我的观点:----(不知对不对,请知道的网友指正)

1.不用声明virtual 来声明基类,在子类直接用new 方式 来重写.
2.基类用声明virtual 来声明,在子类用override 方式 来重写.

请问:
这两个子类的以上两种重写结果 是一样的?编辑器出的内部代码也没有不同?
[/Quote]
webwalker 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 david8977 的回复:]

《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract)

virtual 子类可以用基类默认方法,abstract子类必须重写方法,
《2》两个重写的区别 override 与 new (我应该用那一个,我只会从中随便选一个来用,一般选 override )
override 子类覆盖父类中同名方法,new 子类的方法是子类的,……
[/Quote]

赞成,不要搞的太“深”
niumengyan 2012-03-09
  • 打赏
  • 举报
回复
我也是搞不懂··现在学得迷迷糊糊的··
bidisty 2012-03-09
  • 打赏
  • 举报
回复
不知道。我都不写的
SMG008 2012-03-09
  • 打赏
  • 举报
回复
+1[Quote=引用 2 楼 zhizhuochangeing 的回复:]
回答:

1.virtual是虚方法,方法里可以有实现,也可以没有实现。abstract是抽象方法。没有方法体,没有实现。其实这要分具体情况判断。如果写一个方法,方法体没有啥实现的话,那么就选用抽象方法。举个例子:交通工具:都有跑的方法,那么定义一个交通工具跑的方法,那么此方法是虚方法还是抽象方法呢? 我们来分析一下,很明显:交通工具----有汽车、轿车、卡车。等等。。。都有跑的方法,汽车是频……
[/Quote]
lcj_net 2012-03-09
  • 打赏
  • 举报
回复
看晕了
hetengfei_ 2012-03-08
  • 打赏
  • 举报
回复
几天后,想起贴子的第二个问题,
再次阐述我的观点:----(不知对不对,请知道的网友指正)

1.不用声明virtual 来声明基类,在子类直接用new 方式 来重写.
2.基类用声明virtual 来声明,在子类用override 方式 来重写.

请问:
这两个子类的以上两种重写结果 是一样的?编辑器出的内部代码也没有不同?
tellxp 2012-03-07
  • 打赏
  • 举报
回复
abstract主要针对类,抽象类
virtual主要针对某一个函数
claymore1114 2012-03-07
  • 打赏
  • 举报
回复
以前面试 经常看到的啊
加载更多回复(52)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧