c# - 在C#中实现接口(interface)时如何传递子类参数?

标签 c# class interface parameters

作为 OOP 的新手,我试图通过传递一个(需要的)子类参数来实现一个带有基本参数的接口(interface)方法。我有:


public interface IArticleDataAccess { int SaveArticle(NewsArticle thisArticle); }

public AnalysisDataAccess : IArticleDataAccess {
  public int SaveArticle(AnalysisArticle thisArticle) {
    // Specific save code that needs properties of AnalysisArticle not found in NewsArticle.
}
public class AnalysisArticle : NewsArticle {
  IArticleDataAccess dataAccess = new ArchivedArticleDataAccess();
  int Save() {
    return dataAccess.SaveArticle(this);
  }
}

错误是“ArchivedArticleDataAccess”没有实现接口(interface)成员“IArticleDataAccess.SaveArticle(NewsArticle)”,因为参数类型不一样。

我是犯了一个小错误还是错过了基本的 OOP 概念?我可以使用一种模式来做到这一点吗?类型转换还是泛型?或者这是 C# 的限制(不支持逆变参数)?

最佳答案

你不能在这里应用逆变,因为它会破坏契约。我可以通过接口(interface)将任何类型的 NewsArticle 发送到 SaveArticle 类,然后您的 AnalysisDataAccess 就会吐...

你应该做的是使用泛型,像这样:

public interface IArticleDataAccess<T> where T : NewsArticle
{
    int SaveArticle(T thisArticle);
}

public AnalysisDataAccess : IArticleDataAccess<AnalysisArticle> {
  public int SaveArticle(AnalysisArticle thisArticle) {
    // Specific save code that needs properties of AnalysisArticle not found in NewsArticle.
}
public class AnalysisArticle : NewsArticle {
  IArticleDataAccess<AnalysisArticle> dataAccess = new AnalysisArticleDataAccess();
  int Save() {
    return dataAccess.SaveArticle(this);
  }
}

关于c# - 在C#中实现接口(interface)时如何传递子类参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132403/

相关文章:

interface - 如何实现带返回类型的接口(interface)方法是Golang中的一个接口(interface)

reflection - 验证一个接口(interface)是否满足另一个接口(interface)

如果选择了组合框项目,C# WPF 更改网格可见性

c# - 从 n 中获取 k 元素的所有组合的算法

c# - c#中如何为方法添加参数注释

python - 为什么这里会发生递归?

javascript - 如何在 React.js 中将 Prop 从一个类传递到另一个类

c# - 将 C# 二维数组格式化为 Javascript

C++在基类问题上返回带有模板的嵌套类

java - 接口(interface)和数据库