一句话:你是否真的了解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");
}
}
{
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");
}
}
本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/02/08/1950001.html,如需转载请自行联系原作者