6.Unity面向对象-接口与抽象类

遵循"优先考虑组合而不是继承"的哲学,本指南中的许多示例使用接口。但是,你也可以通过抽象类遵循许多设计原则和模式。

两者都是在C#中实现抽象的有效方式。使用哪一个取决于你的情况需要。

抽象类

abstract关键字允许你定义一个基类,这样你就可以通过继承将通用功能(方法、字段、常量等)传递给子类。

你不能直接实例化一个抽象类。相反,你需要派生一个具体类。

在前面的示例中,抽象类可以实现相同的依赖倒置,只是方法不同。所以不是使用接口,而是从一个名为Switchable的抽象类派生一个具体类(例如Light或Door)。
在这里插入图片描述

使用抽象类

继承定义了一个"is a"关系。上图显示所有可以打开和关闭的"可切换"的东西。

抽象类的优势在于它们可以有字段和常量以及静态成员。它们还可以应用更受限的访问修饰符,如protected和private。与接口不同,抽象类允许你实现逻辑,使你能够在具体类之间共享核心功能。

继承在你想要创建一个具有两个不同基类特征的派生类时效果很好。在C#中,你不能从多个基类继承。
在这里插入图片描述

选择基类

如果你有另一个游戏中所有机器人的抽象类,那么更难决定派生什么。你使用Robot还是Switchable基类?

接口

正如在接口隔离原则中看到的,当某些东西不能整齐地放入继承范式时,接口给你更多灵活性。你可以更容易地通过"has a"关系进行选择。

但是,接口只包含其成员的声明。实际实现接口的类将负责充实具体的逻辑。

因此,这不总是一个非此即彼的决定。使用抽象类在你想要共享代码的地方定义基本功能。使用接口在你需要灵活性的地方定义外围能力。

在这个示例中,你可以从Robot基类派生NPC以继承其核心功能,但使用接口ISwitchable添加切换NPC开关的能力。
在这里插入图片描述

请记住抽象类和接口之间的以下区别:

抽象类接口
完全或部分实现方法声明方法但不能实现它们
声明/使用变量和字段只声明方法和属性(但不是字段)
有静态成员不能声明/使用静态成员
使用构造函数不能使用构造函数
使用所有访问修饰符(protected、private等)不能使用访问修饰符(所有成员都是隐式公共的)

记住:一个类最多可以继承一个抽象类,但它可以实现多个接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值