C#虚方法、虚属性


1、虚方法的意义 
C#中指出:普通的方法重载:指的是类中两个以上的方法(包括隐藏的,继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。 
而在派生类中重新定义此虚函数时要求的是:方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数完全一致。 
简单一点说就是子类中override的方法能够覆盖基类中的virtual方法,当你把一个子类的实例转换为基类时,调用该方法时还是调用的子类的override的方法。 
一个类里面两个名字一样的函数叫“重载”,基类和继承类里面名字一样的函数叫“重写”,重写就必须使用虚函数。 
只有基类的方法加上关键字virtual后才可以被派生类override,从而实现面向对象最重要的特征–多态性,即基类可以使用派生类的方法 
父類中的方法重載,提供了某行為的不同實現方法(傳入不同的參數); 
在子類中對父類相應方法的重載﹐可以這樣理解(但實際編譯過程不是這樣)﹐子類完全copy父類代碼后﹐把重載(override)的那部分代碼挖去并用子類新的代碼補上。如果子類沒有重載(沒使用override關鍵字)而有和父類完全一樣的方法,可以這樣理解﹐子類并沒有挖去代碼﹐只是簡單覆蓋﹐當要使用繼承來的代碼時﹐只需要類型轉換就可以把覆蓋的代碼浮現出來。

2、虚方法的特点(与普通方法的区别)

**我们知道抽象类也可以实现多态,那么抽象方法与虚方法有什么区别呢**
1.抽象方法必须在抽象类中,但是虚方法可以存在于普通类中
2.抽象方法不能在父类中实现,只能在子类中实现,但是虚方法可以在父类中实现,不实现也可以,但是要加大括号,保持为空就行
3.抽象方法在非抽象子类中必须实现,但是虚方法不用,虚方法可以选择实现与不实现,傲娇
4.C#中不光方法可以为虚方法,属性也可以为虚属性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//所谓方法替换就是在子类中重新实现父类中的方法
//字段不能为虚,方法和属性可以

namespace learning
{
    public class Super {
        //属性也可以为虚,也可以子类中重写
        public virtual string Name {
            get {
                 return "老王";
            }
        }
        public void A()
        {
            Console.WriteLine("这个方法A 是在父类Super中定义的");
        }
        
        //定义一个虚方法B,需要加关键字virtual
        public virtual void B()
        {
            Console.WriteLine("这个方法B 是在父类Super中定义的");
        }
    }
        public class Sub : Super {        
        
        //想要在子类中重新实现父类中的方法,你可以直接不加new,但是习惯写上
        public new void A() {
            Console.WriteLine("这个方法A 是在子类Sub中重新实现的A方法");
        }       
        
        //子类中要重写父类中的虚方法,则需要加override修饰符
        public override void B()
        {
            Console.WriteLine("这个方法B 是在子类Sub中重新实现的B方法");
        }        
        
        //重写父类中的虚方法
        public override string Name {            
            get {                
                return "老张";
            }
        }
    }

    class Program{        
            public static void Main(string[] args){            
            
            //由哪种类型引用的则调用的是该类型中的,下面三种就是方法替换

            Super super = new Super();//使用父类类型引用父类对象
            super.A();//这个最终调用的是Super中的A方法
            super.B();//这个调用的是Super中的B方法
            Console.WriteLine(super.Name);//打印父类中的虚属性name

            Sub sub = new Sub();//使用子类类型引用子类对象
            sub.A();//如果子类中没有重新实现方法A,那么调用Super中的A方法,否则调用子类中的
            sub.B();//这个调用的是子类Sub中的B方法
            Console.WriteLine(sub.Name);//打印子类中重写的虚属性

            Super c = new Sub();//使用父类类型引用子类对象
            c.A();//最终调用的是父类中的A方法

            c.B();//但是但是这个最终调用的是子类中的B(多态调用),这就是虚方法的特性,输出看的是被调用对象的类型,这个其实也是一种多态
            Console.WriteLine(c.Name);//多态打印子类中重写的虚属性

            //多态可以简单理解为:使用父类类型调用子类中实现的方法

            //我们知道抽象类也可以实现多态,那么抽象方法与虚方法有什么区别呢
            //1.抽象方法必须在抽象类中,但是虚方法可以存在于普通类中
            //2.抽象方法不能在父类中实现,只能在子类中实现,但是虚方法可以在父类中实现,不实现也可以,但是要加大括号,保持为空就行
            //3.抽象方法在非抽象子类中必须实现,但是虚方法不用,虚方法可以选择实现与不实现,傲娇
            //4.C#中不光方法可以为虚方法,属性也可以为虚属性
        }

    }
}

happysneaker.com

Unity那些事儿
请先登录后发表评论
  • 最新评论
  • 总共0条评论