C#中new, override, virtual的具体用法-阿里云开发者社区

开发者社区> 文艺小青年> 正文

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,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9718 0
Hello China操作系统在Virtual PC上的安装和使用
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">http://blog.csdn.net/hellochina15/article/details/7253350<br></p> <p style="color: rgb(51, 51, 51); font-fa
1457 0
【转】Virtual 与 abstract 区别之我见
Virtual 与 abstract 区别之我见 原文:http://www.cnblogs.com/wyjgreat/archive/2011/06/07/2074182.html    1.abstract方法只能在抽象类中声明,虚方法则不是。
828 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13439 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载