2016-10-16 4 views
0

Мне нужно создать файл 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

Вы должны объявить Test, как

public class Test : ITest<IClassA> 

вместо ITest<ClassA>.

Или объявить ITest<TClassA> в качестве ковариации над TClassA:

public interface ITest<out TClassA> where TClassA : IClassA 
1

Test -классом реализует бетон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; 
    } 
} 
+0

Я хочу, чтобы класс Test, чтобы иметь свойство ClassA и не IClassA, это не возможно? – Gal1014

+0

Да, это так. Посмотрите @Thomas [ответ] (http://stackoverflow.com/a/40069043/594832): Если 'ITest ' является ковариантным, это возможно: https://dotnetfiddle.net/KKkktG – khlr

Смежные вопросы