.Net学习 第3季 C#面向对象 多态

.Net 视频学习第2季 C#面向对象

面向对象 多态

概念:让一个(父类)对象表现出多种(子类)类型的特性;三种方法:虚方法/抽象类/接口

方法一:虚方法

将父类方法标记为虚方法,使用关键字virtual在返回值类型前,这个方法可以被子类重写一遍(在子类方法返回值类型前使用关键字override)

没有使用虚方法下:

public class Person
{    private string _name;    public string Name    {        get{return _name;}     set{_name = value;}    }    public Person(string name)    {        this.Name = name;    }    public void SayHello()    {        Console.WriteLine("I am a person");    }
}
public class Chinese:Person
{    public Chinese(string name):base(name)    {    }    public void SayHello()    {        Console.WriteLine("I am Chinese");    }
}

public class Japanese:Person
{    public Japanese(string name):base(name)    {    }    public void SayHello()    {        Console.WriteLine("I am Japanese");    }
}

创建Person[]数组,将Chinese和Japanese的对象放进去(里氏转换),再遍历数组成员调用其SayHello()方法,将全部得到I am a person,因为尽管放进去的是Chinese和Japanses的对象,但是数组本身是Person数组,所以成员会被解释成Person类型的对象,从而只能调用父类Person的SayHello()方法。要想得到子类的方法调用,需要进行强制类型转换。

Person
{
  ...  public virtual void SayHello(){}
}

Chinese:Person{  ....  public override void SayHello(){}}

Japanese:Person{  ....  public override void SayHello(){}}

通过上述的虚方法,在数组中不需要进行强制转换,Chinese/Japanese的对象会调用各自子类中的SayHello()。

实质:调用的依然是父类的方法,但是该方法已被子类重写,至于选择哪个子类的重写版本,取决于该父类对象装的是哪个子类对象(如果没有装子类对象,就是父类对象本身,则会调用父类方法)

方法二:抽象类

当父类的方法不确定如何实现的时候,可以选择将父类写成抽象类,同时父类方法写为抽象方法,使用关键字abstract,注意抽象方法不允许有方法体(就是说没有那一对大括号)

public abstract class Animal
{
  public abstract void Bark();
}

public class Dog:Animal{    public override void Bark()  {    Console.WriteLine("XXXX");  }}
public class Cat:Animal{    public override void Bark()  {    Console.WriteLine("YYYY");  }}
 

抽象类无法创建对象。但子类的对象调用方法时时调用父类的抽象方法(只不过内容被自己子类的方法重写了)

方法有实际意义用虚方法,无实际意义用抽象方法

时间: 2024-10-12 23:49:09

.Net学习 第3季 C#面向对象 多态的相关文章

.Net学习 第3季 C#面向对象 接口

.Net 视频学习第3季 C#面向对象 面向对象 接口 C++中一个类可以继承于多个类,但C#中不允许.因此如果想实现类似操作,需要接口,关键字interface public class Person { } public interface Iable { void test(); } public class Student:Person,Iable { void test() { Console.WriteLine("test"); } } 接口名通常以I开头able结尾. 接

.Net学习 第3季 C#面向对象 访问修饰符

.Net 视频学习第3季 C#面向对象 面向对象 访问修饰符 C#五种访问修饰符 1)可以修饰类的访问修饰符只有两个:public,internal(默认) internal:只可以在当前程序集(先理解为项目)中访问 public:公共的 项目A访问项目B中的public类,首先要在项目A的引用中添加项目B,然后再项目A的文件中添加using 项目B该类的命名空间. 在同一个程序集当中,public和internal的访问权限一样. 2)修饰类的成员的访问修饰符:public,private,p

.Net学习 第2季 C#面向对象

.Net 视频学习第2季 C#面向对象 面向对象初级 类是一个模板,不占内存,对象是根据模板生成的具象,占内存. 字段field:数据 方法method:函数 属性property:保护字段,对字段的赋值进行限定(将这部分封装在类中,外界不用理会如何实现)属性的本质就是两个方法 get() / set() 外部(甚至类内部的方法)通过属性对字段进行赋值/读取,get()/set()内部会进行限定,字段永远用private,属性才是public的. namespace Proj { class P

.Net学习 第2季05 C#面向对象 Path类 File类

.Net 视频学习第2季 C#面向对象 面向对象 Path类 File类 Path类,命名空间IO,静态类 Path.GetFileName(str),返回文件路径中的文件名,返回值为string Path.GetFileNameWithoutExtension(str),返回文件路径中的文件名,不带扩展名,返回值为string Path.GetExtension(str),返回文件路径中的文件的扩展名,返回值为string Path.GetDirectoryName(str),返回文件所在的全

.Net学习 第2季05 C#面向对象 ArrayList

.Net 视频学习第2季 C#面向对象 面向对象 ArrayList 数组:类型单一(除非是父类数组,子类对象作元素---注意元素还是被认为是父类对象!),长度固定 int[] a = new int[10]; 集合:命名空间System.Collections ArrayList list = new ArrayList(); 往集合里边添加数据 list.Add(1); 对同一个集合,可以往里边添加任意类型的数据.(注意Add()方法的输入参数是object类,是所有类型的基类) Array

.Net学习 第2季02 C#面向对象继承1

.Net 视频学习第2季 C#面向对象 面向对象继承1 查找类的命名空间快捷键:alt+shift+F10 项目A中有类X,要在项目B中使用X的话,首先在项目B的引用当中添加项目A,然后在项目B的代码中添加using A;(假设项目A类X的命名空间就是A)或者在使用X时采用A.X的格式. 记录运行时间 Stopwatch sw = new Stopwatch(); sw.Start(); // 代码 sw.Stop(); Console.WriteLine(sw.Elapsed); Start(

.Net学习 第2季04 C#面向对象 里氏转换 随机数 protected

.Net 视频学习第2季 C#面向对象 面向对象 里氏转换 随机数 protected 里氏转换:子类对象可以赋值给父类对象:如果父类中装的是子类对象,可以将此父类对象强制转换成子类对象. 子类对象可以调用父类成员,但父类对象永远只能调用自己的成员. is或者as均表示类型转换,is返回true/false,as返回转换后对象/null class Person { public string Name {get;set;} } class Student:Person { } class Te

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

.Net学习 第2季10 简单工厂设计模式

.Net 视频学习第2季 简单工厂设计模式 设计模式就是解决一类问题的设计方案,有人总结了23种常见的设计模式,简单工厂是其中一种. 一个简单的工厂会生产不同的商品,例如笔记本工厂会生产不同品牌的笔记本,而客户需要哪一款需要通过询问客户才能得知.简单工厂设计模式的核心就是,尽可能屏蔽各个品牌笔记本的差异,消除其带来的代码冗余, 返回一个笔记本的父类,里面装的是子类对象,通过抽象类来实现多态. 例如,笔记本工厂生产4种品牌的笔记本A,B,C,D,如果不用笔记本父类,在main方法中先询问客户需要哪