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

简介:

 一句话:你是否真的了解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 " );
}
}

 
















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/541067,如需转载请自行联系原作者






相关文章
|
7月前
|
C#
C# Dev chartControl的用法
C# Dev chartControl的用法
|
7月前
|
安全 C#
C# List基本用法
C# List基本用法
|
19天前
|
C#
c#中switch case语句的用法
C#中的 `switch case`语句提供了一种简洁而高效的方式来处理多个条件分支。通过了解其基本语法、注意事项和高级用法,可以在实际开发中灵活运用 `switch case`,提高代码的可读性和维护性。希望本文能帮助你更好地理解和使用C#中的 `switch case`语句。
47 0
|
4月前
|
C#
C#中的overload,overwrite,override的语义区别
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。
139 7
|
4月前
|
C# 索引
C#中的virtual和override关键字
C#中的virtual和override关键字
49 3
|
6月前
|
C#
技术经验分享:C#DUID的用法及取得整数的几个方法
技术经验分享:C#DUID的用法及取得整数的几个方法
70 1
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
209 3
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
34 3
|
28天前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
43 4
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
48 2