在C#中实现接口时如何传递子类参数?

4 c# parameters interface class

作为OOP的新手,我试图通过传递(必需的)子类参数来实现具有基本参数的接口方法.我有:


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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

我犯了一个小错误或错过了一个有趣的OOP概念吗?有没有我可以用来做这个的模式?铸造还是仿制药?或者这是C#的限制(没有逆变参数支持)?

R. *_*des 8

你不能在这里申请逆转,因为它会破坏合同.我可以NewsArticle通过界面发送任何类型的SaveArticle类,然后你的barf 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);
  }
}
Run Code Online (Sandbox Code Playgroud)