对C# 多态的理解

面向对象三要素:封装、继承、多态。
封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。
我们应该经常会看到面试题目:请谈谈对多态的理解。
其实呢,多态非常简单,就一句话:调用同一种方法产生了不同的结果。
具体实现方式有三种。

一、重载

重载很简单。

public string GetValue(string x)
{
  return x;
}
public string GetValue(string x, string y)
{
  return x+y;
}
//调用
string myValue=GetValue("测试");
string myValue2=GetValue("测试","方法");//调用了GetValue同一种方法,只是多了个参数,但还是算得上“同一种方法”。

二、重写父类中的虚方法

public class BaseClass
{
  public virtual void GetValue() //virtual关键字,供后面的子类重写该方法
  {
   Console.WriteLine("这是个虚方法");
  }
}
public class MyClass: BaseClass
{
  public override void GetValue()
  {
   Console.WriteLine("MyClass重写了基类的虚方法");
  }
}
public class NewClass: BaseClass
{
  public override void GetValue()
  {
   Console.WriteLine("NewClass重写了基类的方法");
  }
}

public class Program
{
  static void Main()
  {
   BaseClass baseClass=new BaseClass();
   MyClass myClass=new MyClass();
   NewClass newClass=new NewClass();
   //在这里你会无意间想到一句很经典的话:不同的对象调用了同一种方法产生了不同的行为
   baseClass.GetValue();//这是个虚方法
   myClass.GetValue();//MyClass重写了基类的虚方法
   newClass.GetValue();//NewClass重写了基类的方法
  }
}

关于继承,还是要谈一下is和as运算符的

我们都知道,所有的类都是默认继承System.Object这个类的,也就是说所有的类都可以转化为Object。子类可以转换为父类,毕竟子类就属于父类。

在上面这个例子,MyClass类是继承BaseClass类的,也就是说MyClass可以转为BaseClass。可能,我们会想到强制转换 baseClass=(BaseClass)myClass,这样做是可以的,但如果myClass继承的不是BaseClass则会抛出异常,这样不好。这时,应该用as与is运算符,BaseClass baseClass = myClass as BaseClass,这句话,如果运行出错的话,会将null赋值给baseClass,也就是说,在使用baseClass这个对象之前,我们只需判断是否为空就行了。

MyClass myClass = new MyClass();
BaseClass baseClass = myClass as BaseClass;//即使转换的不会,只会将null赋值给baseClass,不会抛出异常。
if (baseClass != null)//只需判断一下是否为空即可
{
  baseClass.GetValue();
}
if(myClass is baseClass)
{
  Console.WriteLine("myClass是属于baseClass的");
}

三、实现抽象类中的方法,也是使用的override关键字

老生常谈,抽象类是不可以实例化的,抽象类的目的就是为了让其他类继承,而且只能继承一个类,如果想要实现多重继承,便诞生了接口。

public abstract class BaseClass
{
  public abstract void GetValue();//抽象方法,不能有方法实体
  public void GetValue2()
  {
   Console.WriteLine("实体方法");//抽象类可以有实体方法,抽象类是不可以实例化的,但他的子类的实例可以调用这个方法
  }
}
public class MyClass: BaseClass
{
  public override void GetValue()
  {
   Console.WriteLine("MyClass重写了基类的虚方法");
  }
}
public Class NewClass: BaseClass
{
  public override void GetValue()
  {
   Console.WriteLine("NewClass重写了基类的方法");
  }
}

public class Program
{
  static void Main()
  {
   MyClass myClass=new MyClass();
   NewClass newClass=new NewClass();
   myClass.GetValue();
   myClass.GetValue2();//子类的实例可以调用这个方法
   newClass.GetValue();
  }
}

总结

注意点:

1、好好体会多态的实现,渐渐地会发现面向对象程序设计的魅力。

2、抽象类的目的就是为了继承,想要实现多重继承,就需要接口了。

3、抽象类不可以实例化,它是可以有实体方法的,继承这个抽象类的实例可以调用抽象类里面的实体方法。

4、会熟练使用is和as运算符,不要一味地使用强制转换

以上就是对C# 多态的理解的详细内容,更多关于C# 多态的理解的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解c# 多态

    多态是同一个行为具有多个不同表现形式或形态的能力. 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态多态性中,函数的响应是在运行时发生的. 在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 现实中,比如我们按下 F1 键这个动作: 如果当前在 Flash 界面下弹出

  • C#中多态、重载、重写区别分析

    本文实例总结了C#中多态.重载与重写的概念与区别.对于初学C#的朋友来说有不错的参考价值.分享给大家供大家参考.具体分析如下: 重写:是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式如下: 1.在基类中: public virtual void myMethod() { } 2.在子类中: public override void myMethod() { } 重写以后,用基类对象和子类对象访问myMethod()方法,结果都是访问在

  • C#与.net高级编程 C#的多态介绍

    用virtual关键字标记的方法称为虚方法,如果子类希望改变虚方法的实现细节就必须使用 override关键字. 抽象类 abstract关键字 防止创建毫无意义的基本类,使用abstract关键字创建抽象基类,防止被实例化 使用abstract关键字创建抽象方法,强制每一个子类重写特定的方法,abstract成员没有提供任何实现. (注:抽象方法只可以定义在抽象类中,如果不是这样的话,就会收到编译器错误) 成员投影 如果派生类定义的成员和定义在蕨类中的成员一致,派生类投影了父类的版本. 如:我

  • 深入理解c#多态

    继承概念 多态:即一个接口,多个功能 同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态多态性中,函数的响应是在运行时发生的 静态多态性 在静态多态性中,函数的响应是在编译时发生的 父类中如果有方法需要子类重写,可以将该方法标记为虚方法 虚方法必须在父类中有实现,空实现也可以 虚方法子类可以重写,也可以不重写 实现静态多态性有两种方法; 函数重载 运算符重载 函数重载 即在同一范围中对同一函数名的多重定

  • C# 面向对象三大特性:封装、继承、多态

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分. 1.封装 每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码.使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些

  • C#基础继承和多态详解

    继承 在现有类(称为基类.父类)上建立新类(称为派生类.子类)的处理过程为继承.派生类能自动获取基类(除了构造函数和析构函数外的所有成员),可以在派生类中添加新的属性和方法扩展其功能. 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Web; public class Person{ private string _id;    public string id   

  • C# 多态性的深入理解

    MSDN 上面的定义:通过继承,一个类可以有多种类型:可以用作它自己的类型,任何基类型,或者在实现接口时用作任何接口的类型.从两个方面来说明多态1.在运行时,方法参数和集合或者是数组等位置,派生类的对象都可以作为基类的对象处理,发生此情况时,该对象的声明类型不再与运行时类型相同.2.基类定义实现虚方法,派生类重写这些方法,在运行时,CLR会查找运行时类型,并且调用派生类重写的方法. 复制代码 代码如下: class Shape    {        public virtual void Dr

  • 深入浅析c#静态多态性与动态多态性

    C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态多态性中,函数的响应是在运行时发生的. 静态多态性 在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定.C# 提供了两种技术来实现静态多态性.分别为: •函数重载 •运算符重载 运算符重载将在下一章节讨论,接下来我们将讨论函数重载. 函数重载 您可以在同一个范围内对相同的函数名有多个定义.函数的定

  • C#中多态现象和多态的实现方法

    本文实例讲述了C#中多态现象和多态的实现方法.分享给大家供大家参考.具体分析如下: 面向对象的特征封装.继承和多态.Polymorphism(多态性)来源于希腊单词,指"多种形态".多态性的一个重要特征是方法的调用是在运行时确定而不是编译时.在.NET中用于实现多态性的关键词有virtual.override.abstract.interface. 一.virtual实现多态   shape类是通用的基类,draw是一个虚方法,每个派生类都可以有自己的override版本,在运行时可以

  • c#继承与多态使用示例

    继承和多态 派生类具有基类所有非私有数据和行为以及新类自己定义的所有其他数据或行为,即子类具有两个有效类型:子类的类型和它继承的基类的类型. 对象可以表示多个类型的能力称为多态性. 多态性示例 复制代码 代码如下: public class Parent    {        public Parent() { }        public void MethodA()        {            Console.WriteLine("调用MethodA()");   

随机推荐