C#中类实现两个继承同一基接口的接口会发生什么?
C#多接口继承下的方法实现问题解答
问题涉及的原始接口定义如下:
public interface IUpgradeable { public void Upgrade(); } public interface ISpeedUpgradeable : IUpgradeable { public int GetCurrentSpeed(); } public interface IDamageUpgradeable : IUpgradeable { public float GetCurrentDamage(); }
对应的实现类代码:
public class SpaceShip : ISpeedUpgradeable, IDamageUpgradeable { public int GetCurrentSpeed() { return 0; } public float GetCurrentDamage() { return 0f; } public void Upgrade() { //实现逻辑 } }
核心结论
你当前代码中的Upgrade()方法同时满足ISpeedUpgradeable和IDamageUpgradeable两个接口的契约要求,不需要为两个接口分别提供实现,不存在“专属归属某一个接口”的说法。
规则解释
C#的接口继承是契约传递而非契约复制:
ISpeedUpgradeable和IDamageUpgradeable继承IUpgradeable时,只是将基接口的成员契约纳入自身的契约集合,并没有定义新的、独立的同签名Upgrade()方法。两个子接口要求实现的Upgrade()本质上就是基接口IUpgradeable定义的那一个方法,整个SpaceShip类只需要实现一次该方法,就可以满足所有相关接口的契约要求。- 无论你将
SpaceShip的实例转换为IUpgradeable、ISpeedUpgradeable还是IDamageUpgradeable类型,调用Upgrade()方法时都会执行你写的这个公共实现,不会出现逻辑分裂。
什么时候需要分开实现?
只有当两个子接口各自重新定义了同签名的成员(也就是用new关键字显式隐藏基接口的同名成员,声明属于自己的版本)时,才会出现多个独立的契约要求,此时需要通过显式接口实现来分别编写逻辑,示例代码如下:
public interface ISpeedUpgradeable : IUpgradeable { // 隐藏基接口的Upgrade,定义自身专属的Upgrade契约 new void Upgrade(); int GetCurrentSpeed(); } public interface IDamageUpgradeable : IUpgradeable { // 隐藏基接口的Upgrade,定义自身专属的Upgrade契约 new void Upgrade(); float GetCurrentDamage(); } public class SpaceShip : ISpeedUpgradeable, IDamageUpgradeable { public int GetCurrentSpeed() => 0; public float GetCurrentDamage() => 0f; // 满足基接口IUpgradeable的契约 public void Upgrade() { // 通用升级逻辑 } // 显式实现ISpeedUpgradeable专属的Upgrade void ISpeedUpgradeable.Upgrade() { // 速度升级专属逻辑 } // 显式实现IDamageUpgradeable专属的Upgrade void IDamageUpgradeable.Upgrade() { // 伤害升级专属逻辑 } }
这种场景下,将实例转换为不同接口类型调用Upgrade(),才会执行对应接口的专属实现。你给出的原始代码不存在这种成员隐藏的情况,因此不需要做分开实现。
内容的提问来源于stack exchange,提问作者Arvin
相关产品推荐
相关产品推荐

