C#多态总结

  

C#多态

      多态 就是同一个方法在不同情况下,会选择不同的效果(多种形态)。

注:同一个父类对象赋予不同的子类对象 就会发生不同的效果。

一、里氏转换

1.子类可以赋值给父类

2.如果父类中装的是子类的对象,则可以将这个父类转换为对应的子类对象

    作用:我们可以将所有的子类都当作是父类来看,针对父类进行编程,写出通用的代码,适用需求的不断改变

                                 父类  a=new 子类();

            注意:当1个父类变量指向了一个子类对象只能通过这个父类变量调用父类的成员子类独有的成员无法调用

  • 里氏替换原则:子类可以替换父类  但是反过来不可以
  • is和as关键字
  1. is:进行类型判断
  2. as:进行类型转换

二、多态的三种实现方法

      1.虚方法:

         1.将父类的方法标记为虚方法,就是在父类方法的返回值前加virtual关键字,表示这个方法可以被子类重写。

         2.子类重写父类方法,在子类的方法的返回值前加override关键字。

         3.父类中的虚方法,子类可以重写,也可以不重写。

         4.父类中virtual修饰的方法,可以用于实现该方法共有的功能(比如初始化该方法),然后再子类重写该方法时,使用base关键字调用父类中的该方法。

         该类,只需要在需要重写的方法面前 添加virtual,就可以被子类重写,而virtual本身所在的方法也是有意义,可以使用的。

语法:

父类:

public virtual 返回值类型 方法名()

   {

方法体代码;

}

子类:

  public override 返回值类型 方法名()

  {

   方法体代码;

}

 

 

 

例子:

          class       Father   //父类

           {

                       public virtual void       DaoXiao()

        {

          Console.WriteLine("学生八点到校")

}

}

class        Son:Father  //子类

            {

                          public override void DaoXiao(){

                               Control.WriteLine("老师九点到校");

}

}

 Father father=new Son();

father.DaoXiao();   //老师打卡

      2、抽象类

        

       父类里面用 virtual 关键字修饰的方法叫做虚方法,子类可以使用override重新该虚方法,也可以不重写。

       虚方法还是有方法体的,当我们父类中的这个方法已经虚到完全无法确定方法体的时候,就可以使用另外一种形式来表现,这种形式叫抽象方法。

抽象方法语法

       抽象方法的返回值类型前用关键字abstract修饰,且无方法体。

       public abstract void Hello();

       抽象方法必须存在于抽象类中。

       abstract class FuLei

       在定义类的关键字class前面加abstract 修饰的类就是抽象类。

       子类继承抽象类,使用 override关键字重写父类中所有的抽象方法。

抽象类注意事项

<1>抽象类中不一定要有抽象方法, 但是抽象方法必须存在于抽象类中。

<2>抽象类不能被实例化, 因为抽象类中有抽象方法(无方法体), 如果真能实例化抽象类的话, 调用这些无方法体的方法是没有任何意义的, 所以无法实例化。

 使用场景

<1>当父类中的方法不知道如何去实现的时候, 可以考虑将父类写成抽象类,将方法写成抽象方法。

<2>如果父类中的方法有默认实现, 并且父类需要被实例化, 这时可以考虑将父类定义成一个普通类, 用虚方法实现多态。

<3>如果父类中的方法没有默认实现, 父类也不需要被实例化, 则可以将该类定义为抽象类。

  例子:

    abstract class NPC
    {
        private string name;
        private NPCType type;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public NPCType Type
        {
            get { return type; }
            set { type = value; }
        }
        public NPC(string name, NPCType type)
        {
            this.name = name;
            this.type = type;
        }
        public abstract void Speak();
    }
    class TaskNPC:NPC
    {
        private string taskInfo;
        public TaskNPC(string taskInfo, string name, NPCType type)
            : base(name, type)
        {//使用base,将name和type传递给父类,进行构造
            this.taskInfo = taskInfo;
        }
        public override void Speak()
        {
            Console.WriteLine("NPC{0},任务{1}", base.Name, taskInfo);
        }
    }

虚方法抽象类语法对比

 

 

     

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值