天天看点

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

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

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

主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有什么不同;

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

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();

triangel.MethodVirtual();

triangel.Method();

diamond.MethodVirtual();

diamond.Method();

private static void TestDerive2()

PrintShape(circle);

PrintShape(rectangle);

PrintShape(triangel);

PrintShape(diamond);

///out put:

//circle override MethodVirtual

//base Method call

//base MethodVirtual call

static void PrintShape(Shape sharpe)

sharpe.MethodVirtual();

sharpe.Method();

}

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,调用的还是子类的方法

///circle override MethodVirtual

///base Method call

///第二类使用方法:使用子类本身

///这很好理解,全部输出的是子类的方法

///Circle circle = new Circle();

///circle.MethodVirtual();

///circle.Method();

///out put:

class Circle : Shape

public override void MethodVirtual()

Console.WriteLine("circle override MethodVirtual");

///类描述:未做任何处理

///第一种使用方法

///sharp s = new Rectangle()

///base MethodVirtual call

///Rectangle rectangle = new Rectangle();

///rectangle.MethodVirtual();

///rectangle.Method();

class Rectangle : Shape

///类描述:new了基类的虚方法即非虚方法

///sharp s = new Triangle()

///因为子类已经new了父类的方法,所以s输出的是父类的方法

///Triangle triangel = new Triangle();

///triangel.MethodVirtual();

///triangel.Method();

///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()

///因为默认new的效果,所以输出和显式new修饰的一样

///Diamond diamond = new Diamond();

///diamond.MethodVirtual();

///diamond.Method();

///Diamond default MethodVirtual

///Diamond default Method

class Diamond : Shape

public void MethodVirtual()

Console.WriteLine("Diamond default MethodVirtual");

Console.WriteLine("Diamond default Method");

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

本文基于

Creative Commons Attribution 2.5 China Mainland License

发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名

http://www.cnblogs.com/luminji

(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。