C#的一个语法求解答

keeya0416 2010-04-27 04:48:14
本人原来学Java的,现在在学习C#;对C#里一个语法有点困惑。
Java中没有C#中的 virtual 和 override 关键字
Java中一切方法都是动态绑定的,过去一直这么用也没发现什么不便之处
最近发现C#中必须得这两个关键字联合起来实行多态
C#在设计这个的时候是出于什么方面的考虑呢?
当父类方法没用virtual关键字的时候,子类用来相同的方法名和参数列表就默认是 new 一个新方法
这样做在使用的时候会不会因为疏忽而造成一些不好的后果呢?
而Java中只要子类方法名和参数列表与父类相同就是重写,感觉用起来比较方便

望高人解惑

本人是出于学习目的想了解下C#的设计思想和各种机制
搞学派之争就不必了 THX
...全文
466 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 hyjchina 的回复:]
引用 20 楼 vrhero 的回复:
引用 19 楼 mytigo 的回复:
这样语法没错,但存在潜在的冲突,所以需要new关键字显示声明隐藏。

没有冲突,明的潜在的都没有...不加new和加new完全一样,不加new编译器仅仅给出警告以提醒你该方法不会被重写...


汗,你也会说,不加new和加new完全一样的啊,加new重写,不加不也是重写了吗?
[/Quote]
只能对你的汉语阅读能力表示遗憾并为你的小学语文老师感到难过...
心蓝168 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 vrhero 的回复:]
引用 19 楼 mytigo 的回复:
这样语法没错,但存在潜在的冲突,所以需要new关键字显示声明隐藏。

没有冲突,明的潜在的都没有...不加new和加new完全一样,不加new编译器仅仅给出警告以提醒你该方法不会被重写...
[/Quote]

汗,你也会说,不加new和加new完全一样的啊,加new重写,不加不也是重写了吗?
绿色夹克衫 2010-04-28
  • 打赏
  • 举报
回复
恩,很有收获,帮LZ顶一下!
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
自己再顶下
望各位都来讨论下
caohao 2010-04-28
  • 打赏
  • 举报
回复
override就是动态绑定的,它调用new 后面的对象的方法,比如: 父类类型 父 = new 子类类型();
父.方法名()将会调用子类重写后的方法!
jbz001 2010-04-28
  • 打赏
  • 举报
回复
没有学过C#
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 sweet_ 的回复:]
LZ的意思 我明白
我也在学JAVA,和C#
可是C#这样的设计你做一两个小程序是体会不到了
它那个不是说重写
而是一种虚拟的覆盖吧,我是这样理解的
可是通过base来掉用基类的,做个小项目体会一下吧
[/Quote]
好像也是叫重写吧
你说的对 我就是没体会到这个的好处才困惑的 呵呵
sweet_ 2010-04-28
  • 打赏
  • 举报
回复
LZ的意思 我明白
我也在学JAVA,和C#
可是C#这样的设计你做一两个小程序是体会不到了
它那个不是说重写
而是一种虚拟的覆盖吧,我是这样理解的
可是通过base来掉用基类的,做个小项目体会一下吧
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 huijianight 的回复:]
个人感觉,好像java中所有的方法都是虚方法,在子类中如果方法签名和父类的相同就是重写。
在c#中方法默认是非虚方法,只有加上了virtual才是虚方法,表示这个方法在子类可以被重写,如果子类要重写这个方法需要在方法前加上override关键字,这样才构成重写。
如果父类没有加上virtual表示这个方法是非虚的,在子类不能被重写,如果子类方法和父类方法签名相同,仅仅表示子类和父类有相同名字的……
[/Quote]
你理解的没错
只是想了解下 C# 的这种机制相比于 Java 来说有哪些优势
夜晚回家 2010-04-28
  • 打赏
  • 举报
回复
个人感觉,好像java中所有的方法都是虚方法,在子类中如果方法签名和父类的相同就是重写。
在c#中方法默认是非虚方法,只有加上了virtual才是虚方法,表示这个方法在子类可以被重写,如果子类要重写这个方法需要在方法前加上override关键字,这样才构成重写。
如果父类没有加上virtual表示这个方法是非虚的,在子类不能被重写,如果子类方法和父类方法签名相同,仅仅表示子类和父类有相同名字的方法而已,没有重写方法,这种做法最好在子类方法前加上new,表示是一个新方法和父类没有关系。

不知道自己的理解是否正确。
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 keeya0416 的回复:]
LS 很多告诉我 virtual 和 ovrride 怎么用的就不必了
我是想知道为什么需要这两个关键字
像Java那样去掉这两个关键字有什么不便之处
C#里这么规定是处于什么目的 有什么编程思想包含在里边
[/Quote]
Java里不允许两个同方法签名却无重写关系的方法
就像在编程中很少有人用到2个同名域一样;故Java直接不让这么写
既然两方法没任何关系为什么得用同名呢,各起一个名称不是更好么
方法同名不同根(无重写关系)具体在什么场景能用到
有什么目的
我想问的是为什么这么用 而不是怎么用
希望大家说说自己的理解
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
LS 很多告诉我 virtual 和 ovrride 怎么用的就不必了
我是想知道为什么需要这两个关键字
像Java那样去掉这两个关键字有什么不便之处
C#里这么规定是处于什么目的 有什么编程思想包含在里边
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 vrhero 的回复:]
不能使用 new、static、virtual 或 abstract 修饰符来修改 override 方法。
[/Quote]
有点疑问

class Test
{

public static void Main(string[] args)
{
A a = new C();
a.TestMethod(); //输出的是 ccccc 说明 C 中的该方法是 A 中声明的那个;
Console.ReadLine();
}

}
}
class A
{
public virtual void TestMethod()
{
Console.WriteLine("aaaaa");
}
}
abstract class B : A
{
public abstract override void TestMethod();
}
class C : B
{
public override void TestMethod()
{
Console.WriteLine("ccccc");
}
}
lh1611 2010-04-28
  • 打赏
  • 举报
回复
一句话说明问题

就是如果没有override那么从基类调用由子类实例化对象 的同名方法时,不会达到

仔细体味一下。
lh1611 2010-04-28
  • 打赏
  • 举报
回复
一句话说明问题

就是如果没有override那么从基类调用由子类实例化对象 的同名方法时,不会达到

仔细体味一下。
lh1611 2010-04-28
  • 打赏
  • 举报
回复
一句话说明问题

就是如果没有override那么从基类调用由子类实例化对象 的同名方法时,不会达到

就是这个意思!!!!
idot 2010-04-28
  • 打赏
  • 举报
回复
如果不写Virtual和overload,则基类和导出类各有一个方法并且它们重名,当你将导出类实例赋予类型为基类的变量并且调用这个方法时,则调用基类方法(因为你没有用Virtual和overload关键字明确规定进行方法重载)
fuchunjun 2010-04-28
  • 打赏
  • 举报
回复
路过回帖,接分。
keeya0416 2010-04-28
  • 打赏
  • 举报
回复
LS说Java效率低 所以C#里明确规定谁是虚方法谁不是虚方法 貌似顶在理的
柳晛 2010-04-28
  • 打赏
  • 举报
回复
我不是搞Java的,不懂。
我记得《C#高级编程》第六版中提到Java所有方法都是虚方法,效率极低,也不安全。
建议楼主购买《C#高级编程》学习C#,这本书是通过与C++、Java的不同点来阐述C#的。
加载更多回复(37)

110,539

社区成员

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

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

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