C#中new, override, virtual的具体用法

    技术2025-06-19  14

    http://www.cnblogs.com/luminji/archive/2011/02/08/1950001.html

     

    一句话:你是否真的了解new, override, virtual

    下面代码的结果,如果基类使用接口代替,也是一样的效果。

    主要注意看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 " ); } }
    最新回复(0)