在接口中实现接口属性

时间:2016-10-16 09:48:39

标签: c# .net

我需要创建一个包含类的所有接口但不包含任何类的dll文件。 因为我将这些接口用于很多类,所以必须是这样的:

public interface IClassA
{
    string Word { get; }
}

public interface ITest<TClassA> where TClassA : IClassA
{
    TClassA A { get; }
}

以我想要的方式实现这些接口的两个类的示例:

public class ClassA : IClassA
{
    public string Word
    {
        get;
        private set;
    }

    public string Sentence
    {
        get;
        private set;
    }

    public ClassA(string word, string sentence)
    {
        this.Word = word;
        this.Sentence = sentence;
    }
}

public class Test : ITest<ClassA>
{
    public ClassA A
    {
        get;
        private set;
    }

    public Test(ClassA a)
    {
        this.A = a;
    }
}

我想在主程序中做类似的事情:

public static void Main(string[] args)
{
    ClassA a = new ClassA("hey", "hey world!");
    Test t = new Test(a);

    Print((ITest<IClassA>)t);        
}

public static void Print(ITest<IClassA> t)
{
    Console.WriteLine(t.A.Word);
}

但是这个转换:(ITest<IClassA>)t会产生运行时错误。 我该如何解决? 谢谢!

2 个答案:

答案 0 :(得分:2)

您应该将Test声明为

public class Test : ITest<IClassA>

而不是ITest<ClassA>

或声明ITest<TClassA>TClassA的协变:

public interface ITest<out TClassA> where TClassA : IClassA

答案 1 :(得分:1)

Test - 类实现具体 ClassApublic class Test : ITest<ClassA>)。

所以你试图将ITest<ClassA>投射到显然失败的ITest<IClassA>

如果你让Test - 类实现IClassA,那么演员就可以了:

public class Test : ITest<IClassA>
{
    public IClassA A
    {
        get; private set;
    }

    public Test(IClassA a)
    {
        this.A = a;
    }
}