c# - 接口(interface)方法返回类型为实现接口(interface)的类

标签 c# interface partial-classes

我无法理解界面。在浏览了这里的类似问题之后,我想出了以下接口(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”。存在显式转换(是否缺少强制转换?)

这是有道理的,但我如何拥有它而不需要 Cast?我希望 Select 返回一个 Post(但不将 Post 定义为接口(interface)级别的返回类型)。我是否误解了界面,或者我是否可以进行快速更改?

最佳答案

您想返回类型为 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);
  }

}

关于c# - 接口(interface)方法返回类型为实现接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297715/

相关文章:

java - 从实现接口(interface)的类调用方法 (java)

.net-maui - .NET MAUI 中的部分平台特定方法

c# - 如何在 Azure 上获取正确的用户代理 header ?

c# - List<T>.IndexOf() 在 C# 中是如何实现的?

c# - 从finallys抛出异常时,不评估捕获 block

java - 不同 Java 类型之间的转换器

c# - 为什么使用 Time.timeScale 制作减速效果时会将分辨率更改为全屏?

java - 公开用于处理 Activity MQ 事件的接口(interface)

c# - 什么时候应该使用 Partial 关键字?

c# - 具有相同名称方法的部分类