搞不明白的几个关键字!《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract)《2》两
搞不明白的几个关键字! 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 《2》两个重写的区别 override 与 new (我应该用那一个,我只会从中随便选一个来用,一般选 override ) 不知大家 能不能举例说说 自已是如何用 这两组东东的?[解决办法] new的效果是,同一个对象,以不同面貌(作为不同类型)出现的时候,调用的方法不是同一个。。。 abstract修饰专门被继承的基类,比如ReadOnlyCollectionBase abstract方法。。。貌似都直接扔去接口里了[解决办法] 回答: 1.virtual是虚方法,方法里可以有实现,也可以没有实现。abstract是抽象方法。没有方法体,没有实现。其实这要分具体情况判断。如果写一个方法,方法体没有啥实现的话,那么就选用抽象方法。举个例子:交通工具:都有跑的方法,那么定义一个交通工具跑的方法,那么此方法是虚方法还是抽象方法呢? 我们来分析一下,很明显:交通工具----有汽车、轿车、卡车。等等。。。都有跑的方法,汽车是频率较快的跑,卡车是频率慢慢的跑,轿车是频率很快的跑。很明显。都有各自跑的方法,所以,我们干脆 交通工具里面的 跑的方法 什么都不做。因为没有啥实际意义。所以定义为抽象方法。 2.说通俗点吧:new是实例化一个新的,override是重新写方法,反正就是New是拿写好的东西来用,override是看写好的东西不爽,拿过来改一下再用。 override是重载所继承的类型方法的 而被继承的类方法必须加virtual 才可以被重载 new 运算符 1.用于创建对象和调用构造函数 例:Class_Test MyClass = new Class_Test(); 2.也用于为值类型调用默认的构造函数 例:int myInt = new int(); myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0; 3.不能重载 new 运算符。 4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 new 修饰符 使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。 [解决办法] 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 子类必须实现abstract方法,而可以选择性实现virtual方法 《2》两个重写的区别 override 与 new 如果父类存在同名方法,同名方法是abstract的话,那么就是override,如果没有修饰符则使用new重写。[解决办法]
探讨 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 子类必须实现abstract方法,而可以选择性实现virtual方法 《2》两个重写的区别 override 与 new 如果父类存在同名方法,同名方法是abstract的话,那么就是override,如果没有修饰符则使用new重写。[解决办法] 探讨 引用: 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 子类必须实现abstract方法,而可以选择性实现virtual方法 《2》两个重写的区别 override 与 new 如果父类存在同名方法,同名方法是abstract的话,那么就是override,如果没有修饰符则……[解决办法] 我也搞不清,学习了
[解决办法] 探讨 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 子类必须实现abstract方法,而可以选择性实现virtual方法 《2》两个重写的区别 override 与 new 如果父类存在同名方法,同名方法是abstract的话,那么就是override,如果没有修饰符则使用new重写。[解决办法] 探讨 回答: 1.virtual是虚方法,方法里可以有实现,也可以没有实现。abstract是抽象方法。没有方法体,没有实现。其实这要分具体情况判断。如果写一个方法,方法体没有啥实现的话,那么就选用抽象方法。举个例子:交通工具:都有跑的方法,那么定义一个交通工具跑的方法,那么此方法是虚方法还是抽象方法呢? 我们来分析一下,很明显:交通工具----有汽车、轿车、卡车。等等。。。都有跑的方法,汽车是……[解决办法] 因为不是一样的东西,当然不能合二为一
[解决办法] http://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx
http://msdn.microsoft.com/zh-cn/library/9fkccyh4.aspx
http://msdn.microsoft.com/zh-cn/library/ebca9ah3.aspx
[解决办法] 简单明子点:
virtual 在实际项目按需求多用于实现多态
abstract 用于做基类
override 是对继承的class or 抽象类实现对virtual abstract方法的重写 实现其逻辑
,对实现的interface的方法重写并实现其逻辑
new 二个用法:
Class objectName=new Instance();创建类的实例并将对对象的引用交给"="左边的变量、名称
用于覆盖父类的"同名同参"的非private修饰的方法 [解决办法] 还有的 继续 studying!!!![解决办法]
探讨 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract) 子类必须实现abstract方法,而可以选择性实现virtual方法 《2》两个重写的区别 override 与 new 如果父类存在同名方法,同名方法是abstract的话,那么就是override,如果没有修饰符则使用new重写。[解决办法] (1)virtual和abstract
虚方法可以有自己的实现,而抽象方法不能有方法体,也就不能有自己的实现。这两个关键字都用在可继承的类里(sealed类自然就不行了),子类在继承的时候,必须实现父类中的抽象方法,而虚方法则不是必须实现的。另外,包含抽象方法的类必须是抽象类,而包含虚方法的类可以是抽象类,也可以是非抽象类。
设计的时候如何选择呢?主要还是看你的这个类的这个方法是否可以包含默认实现,或者,它只是一个契约,没法提供任何实现。比如,人这个类,包含一个撒尿方法,你没法提供默认实现,因为不知道人怎么撒尿,所以只能设计为抽象方法,而对于男人和女人这两个继承自人的类,则完全可以提供站着撒尿和蹲着撒尿的实现,所以可以设计为虚方法,而男人的派生类“腿脚有毛病的男人”,没法站着撒尿,这时父类提供的默认实现就不合适了,所以必须改写。
(2)override和new
override用于覆盖父类中同名的抽象方法和虚方法,所以上面那个腿脚有毛病的男人在改写父类中的撒尿方法时,就应该使用override。
new用于重写父类中的方法,可以是抽象方法、虚方法或普通方法。
override用于扩展和修改,new则是彻底地隐藏父类的方法。
此外,这四个关键字都不止可以修饰方法,对于类中的其他成员,如属性、索引器、事件等也同样适用。
[解决办法] 《1》两个虚假的东西 virtual 与 abstract(一般选用 virtual ,没有用上abstract)
virtual 子类可以用基类默认方法,abstract子类必须重写方法,
《2》两个重写的区别 override 与 new (我应该用那一个,我只会从中随便选一个来用,一般选 override )
override 子类覆盖父类中同名方法,new 子类的方法是子类的,基类的方法用基类的,各是各的,互不影响;
[解决办法] [解决办法] 又是这类问题,帮顶
[解决办法] virtual:有了缺省方法了,你爱改不改。
abstract:你必须自己搞一套。
override:要找就来找我
new:我要把你们都遮了
[解决办法] 探讨 virtual:有了缺省方法了,你爱改不改。 abstract:你必须自己搞一套。 override:要找就来找我 new:我要把你们都遮了[解决办法] 收藏,正在学习C#
[解决办法] 收藏,正在学习C#
[解决办法] a深奥啊
[解决办法] 我也会!
[解决办法] 不太清楚
[解决办法] virtual :用在方法上面 表示该方法可以被重写
abstract :用在类上面 表示该类是抽象类 抽象类的方法就可以用virtual 也可以写具体实现
override :就是重写 表示重写virtual的方法
new :就是覆盖重写
[解决办法] 讲解的非常好
[解决办法] mark 对理论理解很郁闷啊
[解决办法] new这个。。。最好自己去试一试
想不出来什么情况下会需要这种效果
[解决办法] dsadsa das
[解决办法] 探讨 virtual:[关键字] //表示这个方法是可以在子类中被重写,只是一个标志而已 用这个 关键字 的方法, 本类可以写具体现实的代码,也可以不写。 他的子类也是一样(具体现实代码可以写也可以不写) abstract:[关键字] //抽象的,不能写内部代码,只表示有这个东东,却不说这个东东有什么特性 这个方法 必须出现在 abstract(抽象)类中, 这个方法的现实代……[解决办法] 容易混淆
------解决方案--------------------
探讨 所以不知,为什么 没有 把 override 关键字与 new 关键字 合并成一个关键字。 让编译器自动从中选择一个最合适的。[解决办法] 探讨 引用: 提醒一下,这些关键字都不止适用于方法,同样也适用于属性、索引器、事件…… 你说这个事件,我觉得很难理解, 平时我写事件时,没有用过有这些关键字的啊, 不知是如何用的。----事件[解决办法] 探讨 大家看看下面的代码: C# code class Program { static void Main(string[] args) { intList n = new intList(); n.Add(1); n.Add(2); n.Add(3); foreach (int key in n)……[解决办法] 其实呢,非要说new多余,也可以说得过去。因为不使用new而直接覆盖父类成员,也是可以的。但是编译器会告诉你,这样不好,语义不够清晰,因为你可能是无意中声明了一个和父类方法签名一样的方法,建议你如果真的要覆盖,应该使用new关键字,如果不是要覆盖,应该改个名。
[解决办法] 探讨 但vs 也没有任何警告, 加了才是出现 警告! 警告: 说明:成员“委托_只有一个订阅者.intList.RemoveAll()”不会隐藏继承的成员。不需要关键字 new。 文件:D:\data\asp\LinqTo\委托 只有一个订阅者\Program.cs 行:33 列:19 项目:我的测试[解决办法] 你new了一个父类中不存在的方法,编译器自然会警告,没必要使用new。如果不使用new覆盖父类中存在的方法,编译器也会警告:)
[解决办法] C# codeclass A{ public A(int number) { this.Number = number; } public int Number { get; private set; } public virtual int NumberV { get { return this.Number; } }}class A10 : A{ public A10(int number) : base(number){} public new int Number { get { return base.Number * 10; } } public override int NumberV { get { return this.Number; } }}class Program{ static void Main(string[] args) { List<A> listA = new List<A>(); List<A10> listA10 = new List<A10>(); A10 a = new A10(1); listA.Add(a); listA10.Add(a); Console.WriteLine("listA:"); foreach (var item in listA) { Console.WriteLine("Number:" + item.Number); Console.WriteLine("NumberV:" + item.NumberV); } Console.WriteLine("listA10:"); foreach (var item in listA10) { Console.WriteLine("Number:" + item.Number); Console.WriteLine("NumberV:" + item.NumberV); } Console.ReadKey(); }}[解决办法] 探讨 virtual:[关键字] //表示这个方法是可以在子类中被重写,只是一个标志而已 用这个 关键字 的方法, 本类可以写具体现实的代码,也可以不写。 他的子类也是一样(具体现实代码可以写也可以不写) abstract:[关键字] //抽象的,不能写内部代码,只表示有这个东东,却不说这个东东有什么特性 这个方法 必须出现在 abstract(抽象)类中, 这个方法的现实代……[解决办法] 探讨 引用: 没错,因为List<T>根本就没有签名为RemoveAll()这样的方法啊 没有这样的方法,那我是如何用RemoveAll()的: 如下: