C#多态-vob

虚方法vob

概念

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,即为基类中定义的允许在派生类中重写的方法。

虚方法包含:

虚函数:virtual

重写:override

父类:base

声明

访问修饰符 virtual 函数返回类型 函数名(参数表) {函数体};

虚方法规则

1. 虚拟类其实指的是正常类中的虚拟方法,所以虚拟类可以直接使用实例,这是与抽象类不同的一点

2. 虚拟方法是在方法前加virtual关键字,对方法进行声明,说明这个方法为虚方法;

3. 虚拟函数和正常函数无区别;

4. 子类继承虚拟类可以实现虚拟方法也可以不实现虚拟方法;

5. 虚方法可以在不同的继承类中有不同的实现;

注意事项

  • 只有为虚方法时可以进行重写,不能对非虚方法进行重写;

  • 虚方法在形式上在方法名前加virtual修饰;

  • 虚方法一般在基类定义,在派生类中实现具体操作,派生类实现该方法时,要用override对其方法进行修饰;

  • 当用virtual修饰后,不允许再有 static、abstract 或者 override 修饰符;

作用

  • 允许 子类 / 派生类 进行重写;

  • 增加代码的可维护性,脉络较清淅有条理

实例

class Program
    {
    static void Main(string[] args)
            {            
                Gameobject[] objs = new Gameobject[5];
                objs[0] = new Gameobject("A");
                objs[1] = new Player("B");
                objs[2] = new Player("C");
                objs[3] = new Monster("D");
                objs[4] = new Monster("E");
                for(int i = 0; i < objs.Length; i++)
                {
                    objs[i].Attack();
                }
            }

    public class Gameobject//父类
        {
            public string name;
            public Gameobject(string name)
            {
                this.name = name;
            }
            public virtual void Attack()//虚函数
            {
                Console.WriteLine(name + "蓄力");
            }
        }
        
        public class Monster : Gameobject//子类1
        {
            public Monster(string name) : base(name)
            {

            }
            public override void Attack()//重写
            {
                base.Attack();//保留父类行为
                Console.WriteLine(name + "攻击");
            }
        }

        public class Player : Gameobject//子类2
        {
            public Player(string name) : base(name)
            {
                
            }
            public override void Attack()
            {
                Console.WriteLine(name + "发动技能");
            }
        }
    }

运行

总结

  • 利用里氏替换原则用子类容器装载子类对象时,最终调用的是父类容器中的Atk方法,但是由于使用vo多态,所以最终我们调用的方法其实是子类中重写的方法。

  • virtualoverride 体现出 同一类型对象,执行相同行为,有不同的表现。

  • base对于我们来说,可以保留父类行为,进行逻辑拓展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值