静态成员储存在静态存储区
静态成员是该类所有对象共享的,只能用类来访问
(java没有这个要求)
静态函数只能使用静态数据
静态类不能实例化,当游戏中有公共只存一份的成员可以放在静态类中
静态成员储存在静态存储区
静态成员是该类所有对象共享的,只能用类来访问
(java没有这个要求)
静态函数只能使用静态数据
静态类不能实例化,当游戏中有公共只存一份的成员可以放在静态类中
其他修饰符
new 隐藏继承方法
abstract 抽象类和抽象方法
sealed 密封类和密封方法(必须是重写方法,override表示不能被写了)
static 静态(不能和abstract 、sealed一起写)
const (不能和stastic一起使用)声明常量
readonly 声明只读字段 ,只能在初始和构造函数的时候赋值,之后不能修改
virtual用来声明虚方法(父类),override用来重写虚方法(子类)
修饰符
定义:修饰符用来修饰方法,指定函数的可见性
public全部可见
private在类中
protected 派生类中可以访问,在没有继承类的时候跟private是一样的
inteamal同一程序集(比public稍微高一点)
默认的 class +类名是在本项目下
当想在当前项目下访问其他项目中的类:
1.在当前项目添加项目引用
2.引入其他项目的命名空间
3.在其他项目的类+public(父类也需要public)
子类的构造函数
构造函数:方法和类名相同,在创建对象时会调用构造函数
在子类调用父类的构造函数
public DrivedClass():Base//这里的Base是父类的意思,比赛父类名,写不写base结果都一样
顺序:先构造父类,在构造子类
Drivedclass bc1 = new Drivedclass();//必须用子类来创建一个对象,用父类创建的只会完成父类的构造函数
在子类函数调用父类的构造函数
public DrivedClass (int attack,int hp,int speed):base()
当指定调用父类某个有参数的函数时,就不会去调用无参数的函数了
抽象类
如果父类的函数在各个子类中都不要设置不同的函数体,在父类中定义就没必要了,就可以设置只有函数名,没有函数体,声明成抽象函数
1.抽象类的设置(非抽象类里面不能含有抽象函数)
abstract class Enemy
2.抽象函数 的设置
public abstract void Attack();
3.抽象类是不能构造对象的,例如
Enemy ey=new Enemy();
只能声明Enemy ey;但new Enemy() 使用抽象类的模板是错误的
处理办法:在当前行的左边点击实现抽象类
将函数体修改
抽象函数和虚方法的区别:
抽象函数是让父类只需要声明函数,而子类负责设置
在抽象类里abstract class Enemy{
public abstract void Attack()
{。。。} }
在子类里面 class Boss : Enemy
{
public override void Attack()}
虚方法是在子类里重写函数
public virtual void Move()
在boss类中
(输入override会有提示)
public override void Move()
{
base.Move();//和父类相同
}
密封类 sealed
作用:1.防止重写某些类,导致代码混乱
2.商业原因
类不能继承,方法不能重写
在父类用virtual虚方法
普通类+virtual方法
在子类重写方法
继承类+override方法+sealed(该方法不可以再次被重写)
通过隐藏方法来重写
public new viod AI(){...}
相当于直接重写+new,防止出错
这两种virtual和隐藏方向的区别是,在调用函数的时候virtual会调用重写后的方法,也就是子类的,但隐藏方法只是在子类重新
创建子类对象的方式
1.Boss b1=new boss();
2.Enemy b2=new boss();
第二种方式创建时,默认使用的方法是父类的,当使用了virtua虚方法的时候,使用的方法是子类的
可以把子类赋值给父类。但是不能把父类赋值给子类(子类的要求更高)
例如 Enemy enemy=new boss(); 对的
Boss b = new Enemy; 错误
构造的子类对象赋值给父类声明的对象,本质还是子类的对象,但是父类声明的,子类里的方法不能使用
重写函数的办法
1.虚方法
在Enemy中
pubilc virtual void Move()
在boss类中
(输入override会有提示)
public override void Move()
{
base.Move();//和父类相同
}
2.隐藏方法、
this 可以访问父类和子类,base只能访问父类
案例实现
父类--boss
子类--type1ememy、type2ememy
1.创建enemy类
变量包括 血量hp、时间speed
方法(函数)包括AI、移动Move
2 .创建enemy派生出的boss类
boss类包括特殊的变量和方法
例如print方法用来打印boss的各个属性参数
skill方法用来使用技能
attack变量为攻击力
3.创建enemy派生出的type1ememy和type2ememy
访问权限包括:private protected public
protected是指必须要子类才能调用
5.在boss函数中使用构造函数
在主函数中先创建一个boss类的对象名为boos1,参数为100,穿个boss类
boss类
this 的作用
1.可以查看当前对象的所有变量
2.可以用来区分变量的对象
利用类创建对象(因此对象也即为一个变量):
Customer c1 = new Customer();
以上可分为:
Customer c1; //声明对象
c1 = new Customer; //实例化一个对象,否则是空引用(等同于Customer c1 = null; 效果)
可以直接通过这个对象去访问类里的成员
base 基 class 类
drived 派生
派生方法:
Drivedclass :Baseclass
继承
定义:
把相同部分、属性变成父类(搞基)
在派生出来一些子类(派生类)也可以将某部分重写
继承包括:实现继承、接口继承、多重继承
多重继承(c++):例单继承是指只有一个父类派生出所有的子类,而多重继承是指可以继承多个父亲,每一个子类都可以继承自己想要继承的父类(可以有多个父类)
对象引用
将一个类赋值给一个新定义的类
Customer c2= c1;
but这样有一个bug,因为c1、c2的地址相同,修改了他们任何一个彼此都会改变
c1=null;
c1的地址会清空,c1原来的地址所指向的内容如果没有对象在引用的情况下,系统会自动释放空间
字符串是引用类型的,存储的时候会把地址存放在栈中,内容先存放在静态存储区中,在对字符串进行2次赋值(修改)时,静态存储区会先存放新的内容,只是修改字符串的地址,最后存入堆
当对2个字符串进行赋值的时候先把地址存入栈,将内容存入静态存储区然后他们的地址相同
自动生成构造函数:
在存储内存的时候,值类型的会存在栈中
引用类型会先存放在静态存储区,然后将地址存放在栈中,最后内容存放在堆中j
类型包括:值类型 、引用类型
值类型:数值类型、boor、结构体(struct)
char,枚举类型(enum)
引用类型:string、数组、类
值类型存放在栈中
栈(商店)
堆(仓库)
栈: 后进先出
数据只能从栈的顶端插入和删除
入栈(存入) | 出栈(删除)
当属性只有一个set或者get,视为只写或只读
set或者get的对象是属性函数首字母小写之后的变量
自动实现属性
var ni'm
属性
public 类型 变量成员
{
get{....}
set{...}
}
为什么我的属性不能用,属性的默认值是根据函数定义的,函数是public,属性就是public,不过也可以在属性前单独修改
构造函数不用返回值
当形参和参数名相同时可以用this方法
this....>>成员