2017-01-11 135 views
0

我是新来的c#和试图学习通用接口。尝试实现GetComments时出现错误。错误:'cannot convert expression type 'WallGetObject' to return type T'。 有没有可能做这样的事情?谢谢。在c#中实现通用接口#

interface IInterface 
{ 
    T GetComments<T>(int id); 
} 


public class A: IInterface 
{ 
    public T GetComments<T>() 
    { 
     WallGetObject item 
     //... getting item 
     return item 
    } 
} 

public class B : IInterface 
{ 
    public T GetComments<T>() 
     { 
     TopicFeedObject item 
     //... getting item 
     return item 
    } 
} 


public class MainClass() 
{ 

var item1 = new A(); 
var item2 = new B(); 

var list = new List<IInterface>(); 
list.Add(item1); 
list.Add(item2); 


foreach (var i in list) 
{ 
    i.GetComments(5); 
} 
+1

您正在将泛型接口与泛型方法混合使用。你定义它的方式,你有泛型方法的非泛型接口。 –

回答

3

乍一看,我相信你要做的是实现一个接口方法,它为每个具体类返回一个不同的类型。也就是,应返回WallGetObjectB.GetComments()应返回TopicFeedObject。这可以通过使用通用的接口(不像通用的方法那样)来实现。

interface IInterface<T> 
{ 
    T GetComments(int id); 
} 

public class A: IInterface<WallGetObject> 
{ 
    public WallGetObject GetComments() 
    { 
     WallGetObject item 
     //... getting item 
     return item 
    } 
} 

但是,这会进而导致了问题以后,当您尝试创建不同类型的IInterface小号的泛型列表。也就是说,创建一个List<IInterface>需要一个通用的基类/接口,并且根本无法实现上述功能。


真正的答案是不使用泛型这里,而是在WallGetObjectTopicFeedObject基地(抽象)类或接口暴露你需要的常用功能。例如。

interface IComments {} 

class WallGetObject : IComments {} 
class TopicFeedObject : IComments {} 

interface IInterface 
{ 
    IComments GetComments(int id); 
} 

public class A: IInterface 
{ 
    public IComments GetComments() 
    { 
     WallGetObject item 
     //... getting item 
     return item 
    } 
} 

public class B : IInterface 
{ 
    public IComments GetComments() 
    { 
     TopicFeedObject item 
     //... getting item 
     return item 
    } 
} 
+0

感谢您的好解释! –

2

你应该像这样声明和实现你的接口。请注意,泛型类型定义已移至接口声明而非方法声明。

interface IInterface<T> 
{ 
    T GetComments(int id); 
} 


public class A: IInterface<WallGetObject> 
{ 
    public WallGetObject GetComments(int id) 
    { 
     WallGetObject item 
     //... getting item 
     return item 
    } 
} 

public class B : IInterface<TopicFeedObject> 
{ 
    public TopicFeedObject GetComments(int id) 
    { 
     TopicFeedObject item 
     //... getting item 
     return item 
    } 
}