搞不明白的几个关键字!

hetengfei_ 2012-03-05 12:00:04

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

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

不知大家 能不能举例说说 自已是如何用 这两组东东的?
...全文
2618 89 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

111,098

社区成员

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

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

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