[英]How can you call an explicitly declared interface member in a base class from a subclass?
[英]How Can I get a value from a base class that has been declared as an Interface?
这是一个基于OOP的角色扮演游戏。 我在将对象作为接口处理时遇到麻烦。
abstract class Items
{
public string name { get; set; }
}
所有项目都有名称,这是我要获取的属性。
interface Ieatable
{
int amountHealed { get; set; }
}
会治愈一个玩家。
class Healers : Items, Ieatable
{
private int heal;
public int amountHealed
{
get { return heal; }
set { heal = value; }
}
public Healers(int amount, string name)
{
heal = amount;
base.name = name;
}
}
这是我处理可食用物品的地方。 我仔细检查了球员背包中的每个物品。 然后,我检查该物品是否可食用。 然后我正在努力的那一部分,检查玩家背包中的一项是否与作为参数传入的可食用项相同。
public void eatSomethingt(Ieatable eatable)
{
foreach (Items i in items ) //Go through every item(list) in the players backpack
{
if (i is Ieatable && i.name == eatable.name) //ERROR does not contain definition for name
{
Ieatable k = i as Ieatable;
Console.WriteLine(Name + " ate " + eatable.name); //Same ERROR here.
life = life + k.amountHealed;
items.Remove(i);
break;
}
}
}
我会另外定义。
// The base interface for all items.
public interface INamedItem
{
string Name { get; set; }
}
// all classes are derived from INamedItem, so you can always have the Name property.
public interface IEatable : INamedItem
{
int AmountHealed { get; set; }
}
public class Healers : Ieatable
{
public string Name { get; set; }
public int AmountHealed { get; set; }
public Healers(int amountHealed, string name)
{
AmountHealed = amountHealed;
Name = name;
}
}
例:
public void eatSomethingt(IEatable eatable)
{
var eatItem = items.OfType<IEatable>.Where( item => item.Name == eatable.Name).FirstOrDefault();
if (eatItem == null)
return;
life = life + eatItem.amountHealed;
Console.WriteLine(Name + " ate " + eatable.name); //Same ERROR here.
items.Remove(i);
}
您无需更改设计,也可以选择其他答案来使EatSomething
方法起作用。 只需更改传递的类型:
public void eatSomethingt(Healer healer)
{
foreach (Items i in items)
{
if (i is Ieatable && i.name == healer.name)
{
Ieatable k = i as Ieatable;
Console.WriteLine(Name + " ate " + healer.name);
life = life + k.amountHealed;
items.Remove(i);
break;
}
}
}
需要注意的是,您可能需要IEatable
东西,而不是Item
(或Healer
)。 但是,在这种情况下,您可能始终没有可比较的名称,因此需要单独的方法。
您要传递给该方法的IEatable
来自何处? 我认为它源自鼠标单击库存项目,因此,您可以执行以下操作:
public void eatSomethingt(Healer item)
{
Console.WriteLine(Name + " ate " + item.name);
life = life + item.amountHealed;
items.Remove(item);
}
在Items上创建一个界面
interface IITems
{
string name { get; set; }
}
abstract class Items : IItems
{ ....
然后在IEatable中使用它
public interface IEatable : IItems
{ ....
然后,治疗师课程:
public class Healers : IEatable
{ ...
然后,您应该能够访问IEatable类型的name属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.