这是【C# 教程系列第 12 篇】,如果觉得有用的话,欢迎关注专栏。
上一篇博客讲到了 C# 中的抽象类与抽象方法,对这两个概念不清楚的可以 点击此处
通过上篇博客我们会发现,使用 abstract 关键字表示类或成员是抽象的。
抽象方法因为不提供具体的实现,所以没有方法体(一对大括号所包裹的内容),语句以分号结束。 抽象类仅对成员进行声明,但不提供实现代码,就等于设计了一个“空架子”,描绘一幅大致的蓝图,具体如何实现取决于派生类。 正因为抽象类自身不提供实现,所以不能进行实例化,调用没有实现代码的实例没有实际意义。
接着我们在代码中说明如何运用抽象类及抽象方法
这里我写一个表示所有球类的基类 Ball ,并把该类设置为抽象类。 在这个抽象类里有一个可以获取球类名称的抽象访问器,以及一个打球的抽象方法,代码如下
public abstract class Ball
{
//获取球类的名称
public abstract string GetName { get; }
//打球
public abstract void Play();
}
这里的 GetName 属性返回某种球类的名称,如果是足球就返回“足球”,如果是篮球就返回“篮球”。 Play 方法会根据不同的派生类提供不同的实现,如果是足球,就输出“鸣人正在踢足球”,如果是篮球,就输出“佐助正在打篮球”,
接着我写一个足球类 FootBall 和一个篮球类 BasketBall ,并分别继承 Ball 抽象类。
(平常我会用到JB公司的插件 Resharper,把鼠标放到 FootBall类 后的 Ball 类上,这里按下 Alt+Enter 组合键可以快速实现抽象类,然后对生成的代码稍作修改即可) 最终的代码如下:
//足球类
public class FootBall : Ball
{
public override string GetName
{
get { return "足球"; }
}
public override void Play()
{
Debug.Log("鸣人正在踢足球");
}
}
//篮球类
public class BasketBall : Ball
{
public override string GetName
{
get { return "篮球"; }
}
public override void Play()
{
Debug.Log("佐助正在打篮球");
}
}
我们会注意到,实现抽象类的抽象成员也是使用 override 关键字与前面提到的成员覆写相似,实现抽象类,也可以看做是覆写基类的成员。
接着我在继承 MonoBehaviour 类的 Test 类中,写一个 PlayBall 的方法,参数为 Ball 类型的成员。如下代码所示
public class Test : MonoBehaviour
{
public void PlayBall(Ball ball)
{
print("这是"+ball.GetName);
ball.Play();
}
}
重头戏来了!!! PlayBall 方法可以体现抽象类的用途,参数 ball 只声明为 Ball 类型,即定义的抽象类,这样的好处在于,不管调用方法传递进来的是什么类型的对象,只要是实现了 Ball 抽象类的类型即可。 抽象类 Ball 已经规范了派生类肯定存在的 GetName 属性和 Play 方法两个成员,很明显,这种处理方式比较灵活。
最后我在 Start 函数里分明声明足球类与篮球类的实例,并调用 PlayBall 方法,代码如下
void Start()
{
//实例化
FootBall footBall=new FootBall();
BasketBall basketBall=new BasketBall();
//足球实例当 PlayBall 方法的参数
PlayBall(footBall);
//篮球实例当 PlayBall 方法的参数
PlayBall(basketBall);
}
启动u3d,打印结果如下 Perfect!
ok, 抽象类的简单用途就介绍到这里。 各位,晚安!
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。