C# - 使用子类实现接口
C# - Using subclasses to implement interfaces
我有以下接口
public interface IPrice
{
int Price { get; }
}
public interface IGear : IPrice
{
GearUpgrade Upgrades { get; }
}
及以下类
public class GearUpgrade : IPrice
{
public int Price
{
get { return price; }
set { price = value; }
}
}
public class ArmorUpgrade : GearUpgrade
{
}
public class ShieldUpgrade : GearUpgrade
{
}
public class WeaponUpgrade : GearUpgrade
{
}
所以当我尝试实现这样的 IGear 时...
public class Armor : IGear
{
private int price = 0;
public int Price { get => price; }
private ArmorUpgrade upgrades;
public ArmorUpgrade Upgrades
{
get { return upgrades; }
set { upgrades = value; }
}
}
我收到以下错误:
'Armor' does not implement interface member 'IGear.Upgrades'. 'Armor.Upgrades' cannot implement 'IGear.Upgrades' because it does not have the matching return type of 'GearUpgrade'.
我想如果Upgrades
来自GearUpgrade
的子类,接口应该被实现,但显然不是......我是否做了错误的假设?
为了实现接口,方法签名必须完全匹配:C# 不隐式应用协变和逆变。
这是一个允许 Armor
实现 IGear
接口而不干扰 class 的简单修复:
public class Armor : IGear
{
private int price = 0;
public int Price { get => price; }
private ArmorUpgrade upgrades;
public ArmorUpgrade Upgrades
{
get { return upgrades; }
set { upgrades = value; }
}
GearUpgrade IGear.Upgrades => this.Upgrades;
}
我有以下接口
public interface IPrice
{
int Price { get; }
}
public interface IGear : IPrice
{
GearUpgrade Upgrades { get; }
}
及以下类
public class GearUpgrade : IPrice
{
public int Price
{
get { return price; }
set { price = value; }
}
}
public class ArmorUpgrade : GearUpgrade
{
}
public class ShieldUpgrade : GearUpgrade
{
}
public class WeaponUpgrade : GearUpgrade
{
}
所以当我尝试实现这样的 IGear 时...
public class Armor : IGear
{
private int price = 0;
public int Price { get => price; }
private ArmorUpgrade upgrades;
public ArmorUpgrade Upgrades
{
get { return upgrades; }
set { upgrades = value; }
}
}
我收到以下错误:
'Armor' does not implement interface member 'IGear.Upgrades'. 'Armor.Upgrades' cannot implement 'IGear.Upgrades' because it does not have the matching return type of 'GearUpgrade'.
我想如果Upgrades
来自GearUpgrade
的子类,接口应该被实现,但显然不是......我是否做了错误的假设?
为了实现接口,方法签名必须完全匹配:C# 不隐式应用协变和逆变。
这是一个允许 Armor
实现 IGear
接口而不干扰 class 的简单修复:
public class Armor : IGear
{
private int price = 0;
public int Price { get => price; }
private ArmorUpgrade upgrades;
public ArmorUpgrade Upgrades
{
get { return upgrades; }
set { upgrades = value; }
}
GearUpgrade IGear.Upgrades => this.Upgrades;
}