在接口中实现接口属性

本文关键字:接口 属性 实现 | 更新日期: 2023-09-27 18:13:25

我需要创建一个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);
}

但是这个cast: (ITest<IClassA>)t会产生一个运行时错误。我怎么解它?谢谢!

在接口中实现接口属性

您应该将Test声明为

public class Test : ITest<IClassA>

代替ITest<ClassA>

或者声明ITest<TClassA>TClassA上协变:

public interface ITest<out TClassA> where TClassA : IClassA

Test -class实现了具体的 ClassA (public 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;
    }
}