簡體   English   中英

接口方法返回類型是實現接口的類

[英]Interface method return type to be class that implements the interface

我無法理解界面。 在這里搜索了類似的問題后,我想出了以下界面,用於定義所有類所需的CRUD操作:

public interface IData<T>
{
    IData<T> Select(int id);
    List<T> SelectMultiple();
    void Insert();
    void Update();
    void Delete();
}

然后在我的部分類中實現:

public partial class Post : IData<Post>
{
    public IData<Post> Select(int id)
    {
        MyDataContext dc = MyDataContext.Create();
        return dc.Posts.Single(p => p.PostID == id);
    }

    public List<Post> SelectMultiple()
    {
        MyDataContext dc = MyDataContext.Create();
        return dc.Posts.ToList();
    }

    // Update() and Delete() declarations
}

這個都編譯得很好,但是如果我嘗試使用Post Select()方法:

Post p = new Post().Select(1);

失敗, 無法將類型'IData'隱式轉換為'Post'。 存在顯式轉換(您是否錯過了演員?)

這是有道理的,但我如何擁有它以便它不需要演員? 我希望Select返回一個帖子(但不要將Post定義為接口級別的返回類型)。 我是否誤解了界面,或者我可以做出快速修改?

你想要返回T類型的東西,而不是IData<T> ,所以只需更改簽名(至少我猜這是你想要的,否則你將返回List<IData<T>> ):

public interface IData<T>
{
  T Select(int id);
  List<T> SelectMultiple();
  void Insert();
  void Update();
  void Delete();
}

適當地實施它:

public Post Select(int id)
{
    MyDataContext dc = MyDataContext.Create();
    return dc.Posts.Single(p => p.PostID == id);
}

如果您只想在Post類中使用此行為,請顯式實現IData<T>接口:

public partial class Post : IData<Post>
{
  public Post Select(int id)
  {
      MyDataContext dc = MyDataContext.Create();
      return dc.Posts.Single(p => p.PostID == id);
  }

  IData<Post> IData<Post>.Select(int id)
  {
      return Select(id);
  }

}

您需要更改方法以返回Post實例,然后添加返回接口的顯式接口實現。

例如:

public partial class Post : IData<Post> {
    Post Select(int id) { ... }
    IData<Post> IData<Post>.Select(int id) { return Select(id); }
}

嘗試怎么樣?

public Post Select(int id)
{
    MyDataContext dc = MyDataContext.Create();
    return dc.Posts.Single(p => p.PostID == id);
}

即,直接返回Post而不是IData<Post>

您應該顯式實現IData<Post>.Select Select並使用適當的返回值提供您自己的Select 例如:

IData<Post> IData<Post>.Select(int id)
{
    return Select(id);
}

Post Select(int id)
{
    MyDataContext dc = MyDataContext.Create();
    return dc.Posts.Single(p => p.PostID == id);
}

但是,如果你這樣做:

IData<Post> post = new Post();
Post p = post.Select(1);

post.Select(1)仍返回IData<Post> 請參閱Femaref關於重構接口以允許此操作的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM