C#中new, override, virtual的具体用法
2013-11-27 14:00
543 查看
一句话:你是否真的了解new, override, virtual
下面代码的结果,如果基类使用接口代替,也是一样的效果。
主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有什么不同;
代码
下面代码的结果,如果基类使用接口代替,也是一样的效果。
主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有什么不同;
代码
class Program { static void Main(string[] args) { TestShape(); Console.WriteLine("TestShape end =============" + Environment.NewLine); TestDerive(); Console.WriteLine("TestDerive end =============" + Environment.NewLine); TestDerive2(); Console.WriteLine("TestDerive2 end =============" + Environment.NewLine); Console.ReadKey(); } private static void TestShape() { System.Collections.Generic.List<Shape> shapes = new System.Collections.Generic.List<Shape>(); shapes.Add(new Circle()); shapes.Add(new Rectangle()); shapes.Add(new Triangle()); shapes.Add(new Diamond()); foreach (Shape s in shapes) { s.MethodVirtual(); s.Method(); Console.WriteLine(); } } private static void TestDerive() { Circle circle = new Circle(); Rectangle rectangle = new Rectangle(); Triangle triangel = new Triangle(); Diamond diamond = new Diamond(); circle.MethodVirtual(); circle.Method(); Console.WriteLine(); rectangle.MethodVirtual(); rectangle.Method(); Console.WriteLine(); triangel.MethodVirtual(); triangel.Method(); Console.WriteLine(); diamond.MethodVirtual(); diamond.Method(); Console.WriteLine(); } private static void TestDerive2() { Circle circle = new Circle(); PrintShape(circle); Rectangle rectangle = new Rectangle(); PrintShape(rectangle); Triangle triangel = new Triangle(); PrintShape(triangel); Diamond diamond = new Diamond(); PrintShape(diamond); ///out put: //circle override MethodVirtual //base Method call //base MethodVirtual call //base Method call //base MethodVirtual call //base Method call //base MethodVirtual call //base Method call } static void PrintShape(Shape sharpe) { sharpe.MethodVirtual(); sharpe.Method(); Console.WriteLine(); } } public class Shape { public virtual void MethodVirtual() { Console.WriteLine("base MethodVirtual call"); } public void Method() { Console.WriteLine("base Method call"); } } ///类描述:override了基类的virtual方法 /// ///第一种使用方法:转型为父类 ///sharp s = new Circle() ///s.MethodVirtual(); ///s.Method(); ///因为子类已经override了父类的MethodVirtual,所以即使子类转型为了sharp,调用的还是子类的方法 ///out put: ///circle override MethodVirtual ///base Method call /// ///第二类使用方法:使用子类本身 ///这很好理解,全部输出的是子类的方法 ///Circle circle = new Circle(); ///circle.MethodVirtual(); ///circle.Method(); ///out put: ///circle override MethodVirtual ///base Method call class Circle : Shape { public override void MethodVirtual() { Console.WriteLine("circle override MethodVirtual"); } } ///类描述:未做任何处理 /// ///第一种使用方法 ///sharp s = new Rectangle() ///s.MethodVirtual(); ///s.Method(); ///out put: ///base MethodVirtual call ///base Method call /// ///第二类使用方法:使用子类本身 ///这很好理解,全部输出的是子类的方法 ///Rectangle rectangle = new Rectangle(); ///rectangle.MethodVirtual(); ///rectangle.Method(); ///out put: ///base MethodVirtual call ///base Method call class Rectangle : Shape { } ///类描述:new了基类的虚方法即非虚方法 /// ///第一种使用方法 ///sharp s = new Triangle() ///s.MethodVirtual(); ///s.Method(); ///因为子类已经new了父类的方法,所以s输出的是父类的方法 ///out put: ///base MethodVirtual call ///base Method call /// ///第二类使用方法:使用子类本身 ///这很好理解,全部输出的是子类的方法 ///Triangle triangel = new Triangle(); ///triangel.MethodVirtual(); ///triangel.Method(); ///out put: ///triangle new MethodVirtual ///triangle new Method class Triangle : Shape { public new void MethodVirtual() { Console.WriteLine("triangle new MethodVirtual"); } public new void Method() { Console.WriteLine("triangle new Method"); } } ///类描述:创建了基类方法相同的方法,未new及override ///编译器会做提示“隐藏继承”,并有如存在 new 关键字一样执行操作 /// ///第一种使用方法 ///sharp s = new Diamond() ///s.MethodVirtual(); ///s.Method(); ///因为默认new的效果,所以输出和显式new修饰的一样 ///out put: ///base MethodVirtual call ///base Method call /// ///第二类使用方法:使用子类本身 ///这很好理解,全部输出的是子类的方法 ///Diamond diamond = new Diamond(); ///diamond.MethodVirtual(); ///diamond.Method(); ///out put: ///Diamond default MethodVirtual ///Diamond default Method class Diamond : Shape { public void MethodVirtual() { Console.WriteLine("Diamond default MethodVirtual"); } public void Method() { Console.WriteLine("Diamond default Method"); } }
相关文章推荐
- C#中new, override, virtual的具体用法
- C#中new, override, virtual的具体用法
- C#中new, override, virtual的具体用法
- c#中virtual,new和override的区别
- 谈谈C#中的三个关键词new , virtual , override
- 谈谈C#中的三个关键词new , virtual , override
- C# 关键字 abstract, virtual, override, sealed, new
- c#中关于virtual,override和new的理解
- C#中Override关键字和New关键字的用法详解
- C#区分abstract、virtual、override和new
- 浅析C#中new、override、virtual关键字的区别
- c#中的interface abstract virtual override和new
- 谈谈C#中的三个关键词new , virtual , override
- c#virtual,abstract,new,override
- new、override、virtual用法区别
- C#中修饰符用法“virtual(虚拟函数)、override(重载函数)、static(静态函数)、abstract(抽象函数)、sealed(密封函数)”
- c#中的interface abstract virtual override和new
- C#中的static,interface,virtual,abstract,override的用法
- C#--virtual,abstract,override,new,sealed修饰符学习
- C#继承中abstract、virtual、override和new