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

简介:

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

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

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

复制代码
ExpandedBlockStart.gif 代码
 
  
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 " );
}
}
复制代码

 本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/02/08/1950001.html,如需转载请自行联系原作者


相关文章
|
1月前
|
C# 索引
C#学习相关系列之abstract和virtual用法
C#学习相关系列之abstract和virtual用法
|
Java
static在实例Extends、Overload中理解
在写java程序的时候只在类内部调用的方法定义为private的是个很好的编程习惯。另外子类的static方法和父类有同名、同参数的static方法,但他们之间没什么覆盖、继承的关系,你调用的时候看是用那个类名引用了,用子类的类名就调用子类的static方法,用父类类名就调用父类的static方法。
724 0
|
安全 编译器 C++
override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字
 1.override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字 #include &lt;iostream&gt;   //C++中的final和override主要是针对虚函数 //加了final表示拒绝重写,这是为了使某些情况下,拒绝接口的重写 //override,声明重写父类的方法,前提是要有virtual关
914 0