我遇到以下问题:
我有接口ILocation,它包括获取功能位置的功能(在2D网格中)。并非所有类都可以具有此接口,但这些接口彼此无关(不相互继承等)。即具有此接口的类是Person,Item,BuildingBlock ...
现在我有类Location,其中包含变量“block”。基本上任何东西都可以存在,只有一个条件:它必须实现接口ILocation。我怎样才能做到这一点?我不知道,哪个类将在此变量中,因此必须将其指定为Object,但我知道,它必须实现ILocation。怎么办呢?
在下面的示例中,我想实现方法Symbol,它位于ILocation接口中。
public class Location :ILocation
{
public int X {get; set;}
public int Y {get; set;}
public Object block;
public Location (int x, int y, Object o)
{
X = x;
Y = y;
block = o;
}
public char Symbol()
{
return block.Symbol();
}
}
这当然会产生错误,因为类Object的实例块没有实现ILocation。
那么 - 我如何告诉C#,变量“block”中可以是任何实现ILocation的对象?
由于
兹比涅克
答案 0 :(得分:5)
将块变量声明为location:
public ILocation block;
public Location (int x, int y, ILocation o)
{
X = x;
Y = y;
block = o;
}
答案 1 :(得分:0)
lazyberezovsky说的是什么,或者如果你还需要了解块的确切类型,你可以使用泛型的东西,如:
public class Location<TBlock> : ILocation
where TBlock : ILocation
{
public int X { get; set; }
public int Y { get; set; }
public TBlock block;
public Location(int x, int y, TBlock o)
{
X = x;
Y = y;
block = o;
}
public char Symbol()
{
return block.Symbol();
}
}
答案 2 :(得分:0)
用ILocation替换对象。
public ILocation block;
public Location (int x, int y, ILocation o)
因此,无论何时创建Location对象,都可以传递任何实现ILocation接口的对象。
var book = new Book(); // Book implements ILocation.
var person = new Person(); // Person implements ILocation.
var table = new Table(); // Table doesn't implement ILocation.
var bookLocation = new Location(1, 2, book);
var personLocation = new Location(2, 3, person);
var tableLocation = new Location(2, 3, table); // Compile error as table doesn't implement ILocation,