C#:接口而不是变量定义中的类

时间:2013-11-21 12:28:04

标签: c# interface

我遇到以下问题:

我有接口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的对象?

由于

兹比涅克

3 个答案:

答案 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,