2013-10-22 29 views
0

在下面的实现中出现错误。它表示OnlineWebStore_Process无法实现接口IWebStore,因为它们没有匹配的返回类型。但是该方法返回实现在IWebStore接口中用作返回类型的IItem接口的Item。这个问题有什么好的解决方法?作为返回类型的接口出现问题

public interface IItem 
{ 
    string id { get; set; } 
    string name { get; set; } 
} 

public interface IWebStore 
{ 
    List<IItem> GetOnlineItems(); 
} 

public class Item : IItem 
{ 
    public Item(string _id) 
    { 
     id = _id; 
    } 

    public string id { get; set; } 
    public string name { get; set; } 
} 

public class OnlineWebStore_Process : IWebStore 
{ 
    public List<Item> GetOnlineItems() 
    { 
     List<Item> items = new List<Item>(); 

     return items 
    } 
} 
+2

为什么你不改变它,所以它返回一个列表? –

+2

另一件事 - 所有的财产名称都以大写字母开头的惯例。你的物业应该是ID和名称 –

+0

我现在改变了它,它的工作原理。谢谢。另外,我会将属性名称更改为大写字母。 –

回答

5
public class OnlineWebStore_Process : IWebStore 
{ 
    public List<IItem> GetOnlineItems() 
    { 
     List<IItem> items = new List<IItem>(); 

     return items; 
    } 
} 

你的方法签名必须是完全一样的,你不能把一个子类来代替。如果你确实返回了一个子类,那么你就失去了抽象的一部分,并且接口契约被破坏了。

+0

与OP的代码一样,在return语句结尾处缺少';'。 – abelenky

+0

item.Add(new Item(id))给列表提供了一个问题。它说它不能将Item转换为IItem。 –

+0

@KasperHansen:你的'清单'必须是'List '。看看'IWebstore'中的定义。 @Abelenky:欢呼。 –

3

GetOnlineItems()应该返回List<IItem>

1
public List<Item> GetOnlineItems() 
{ 
    List<Item> items = new List<Item>(); 

    return items 
} 

在这里你返回,而不是名单列表。这样你就没有实现你的IWebStore方法。这是正确的方法:

public List<IItem> GetOnlineItems() 
{ 
    List<IItem> items = new List<IItem>(); 
    items.Add(new Item("1")); // Adding an instance, which implements the interface IItem 

    return items; 
} 
+0

该Item构造函数需要一个字符串。 :-) – LarsTech

+0

LarsTech,你当然是对的。 :) – JustAndrei

0

首先你的方法签名需要是相同的。其次List<Item>不是List<IItems>的子项,如ItemIItem。他们是完全不同的类型。