Unity C#基础 记录(后续更新)
1.面向对象的三大特性
说到面向对象的三大特性,首先我们先来了解一下何为面向对象(OOP)。
面向对象 是将现实问题构建关系,然后抽象成类,给类定义属性和方法后,再将类实例化成实例,通过访问实例的属性和调用方法来进行使用,即 对象 = 属性(特征)+ 方法(行为)。
例如我们想要设计几个角色,角色有男女两种性别,外观和行为有一定差异。那么我们可以想到,一个角色不管什么性别,都得有个人样吧,所以我们先仿照自己的构造,在脑海中构思模板的样子(抽象成基类),然后先赋予模板一些共有的行为和特征(定义类的实例方法):
public class HeroInfo
{
/// <summary>
/// 名字
/// </summary>
private string name;
/// <summary>
/// 图标
/// </summary>
public string icon;
/// <summary>
/// 血量
/// </summary>
public int hp;
/// <summary>
/// 最大血量
/// </summary>
public int maxHp;
/// <summary>
/// 防御
/// </summary>
public int def;
/// <summary>
/// 攻击
/// </summary>
public int atk;
public HeroInfo(string name)
{
this.name = name;
}
public virtual void Attack() { }
}
此时我们要求创建 战士和法师,分别要求添加怒气和魔法值设定,以及使用攻击方式不同。
那么我们就要在模板的基础上添加和修改了。通过新建两个类继承自HeroInfo,添加怒气和魔法值设定,并重写Attack方法以达到调用相同的方法出现不同结果(多态性);
设计结束,来回顾一下整个过程。
我们先是把角色的共有特征抽象成 HeroInfo基类,这个基类并不用于实例化,而是用于让 战士类和 法师类去继承它,并实现不同的行为。这样我们就避免把一些共有的行为重复在多个类里定义,如果我们以后想对角色的行为进行变动,也只需要修改 HeroInfo,继承 HeroInfo的子类会自动获得新行为,这是继承带来的好处。
我们把 name 设计为受保护变量(private ),外界无法直接访问这个属性,通过构造传入name。这是 封装 带来的好处。
同时我们在 HeroInfo中预留了 Attack方法并用virtual 关键字修饰,所以在他子类中就能重写这个方法,达到调用相同的方法出现不同结果,这是多态