一:值类型和引用类型
值类型:直接存储数据
引用类型:存储该数据的地址(也就是指针?)
C#中值类型有 基础数据类型(int,float,enum,bool,char,struct.)且值不能为null
而引用类型一般有(class.object.array(数组也算).string)和接口和委托
这种值类型我们可以直接进行赋值copy
比如
int i =1;
int y=i;
这样y也会=1;
而值类型是存储在栈中,在栈中有以下几个特点:空间小,操作快,存储值类型和对象名称
而引用类型存储的对象本体放在堆中,堆的话空间大,操作效率低,存储对象本体
二:C#中的继承
派生和继承本质上指的是一件事情
即 父类派生子类
子类继承父类
<访问修饰符(public,private等)>class<派生类(子类)>:基类( 父类)
public 访问不受限制
private 私有成员在子类不可见,子类中无法直接访问
protect 受保护成员在子类可见
internal C#默认修饰符 即项目内可见
所有父类的成员都会被继承,哪怕是私有的,只是私有的成员无法被直接访问
关键词:base
用于在子类中访问父类成员,指代父类对象
重点:不能在静态方法中使用base,因为base指代的是一个实例
public class 父类(){
private int a; private string b;
public 父类(int a,int b){
this.a=a;
this.b=b;
}
public void 父类方法(){
Debug.Log("执行父类方法....")/*这里用的unity写法不然可以console.write*/
}
}
public class 子类:父类{ private bool c; public 子类(int a,string b,bool c):base(a,b){ this.c=c; } public void 子类方法(){ base.Method1(); Debug.Log("执行子类 ChildClass 定义的方法 Method2 ...."); } }
关键词:Virtual(虚成员) override(重写)
一般而言如果父类方法需要在子类中更改,那么我们需要在父类方法中机上Virtual在子类中使用override
父类:
public virtual void Attack(Character character) { Debug.Log("Chararter 类中定义的 Attack 方法"); }
子类:
public override void Attack(Character character) { character.HP -= this.Ap; Debug.Log($"玩家:{this.Name} 攻击 {character.Name}, {character.Name} 掉血 {this.Ap} 点,剩余血量:{character.HP}"); }
重点:父类对象可以用子类对象进行赋值
比如Enemy类和player类都继承自charater
我们可以
player.Attack(enemy);
enemy.Attack(player);