如何在下面的代码中实现接口?

How can I implement an interface in the below code?

我想实现一个可以在 Projct 和 Employe classes 中使用的接口。我应该如何在接口中创建 Add() 和 ViewAll() 方法,这样我就不必在声明时重载 classes 中的方法,因为方法名称相同,但参数不同。

public class Employe
    {
        public List<Employee> Employees { get; set; } = new List<Employee>();

        public void Add(Employee employee)
        {
            Employees.Add(employee);
        }

        public List<Employee> ViewAll()
        {
            return Employees;
        }

    }
    public class Projct
    {      

        public List<Project> Projects { get; set; } = new List<Project>();

        public void Add(Project project)
        {
            Projects.Add(project);
        }

        public List<Project> ViewAll()
        {
            return Projects;
        }
}

我明白接口就像一个合同,改变参数没有意义。但问题在于实施。此外,我还看到了与该主题相关的大多数线程,看到了与声明参数 class 或使用参数相关的答案,甚至尝试这样做。我还是想不通,所以如果有人能从简单的角度解释一下,那将是欢迎的。

接口可以是通用的:

public interface IMyInterface<T> {
    void Add(T t);
    List<T> ViewAll();
}

定义接口

public interface IAddAndDisplay{
     void Add(T employee);
      List<T> ViewAll();
}

立即实施

public class Employee : IAddAndDisplay<Employee>
{

}

public class Project : IAddAndDisplay<Project>
{

}

你已经有了正确的方法

说了那么多,我认为这对你帮助不大。通用接口可以工作,但不提供您想要的 'plug and play '。

您可以使用泛型类型参数创建接口:

interface ItemCollection<T>
{
    void Add(T item);
    List<T> ViewAll();
}

然后您可以声明您的 classes 实现了通用参数被特定类型替换的接口:

public class Employe : ItemCollection<Employee> { ... }

public class Projct : ItemCollection<Project> { ... }

尽管如此,您仍然需要实现这些方法,就像您所做的那样。

如果你真的想避免代码冗余,你应该创建一个 class(也许使用 abstract 关键字),而不是使用泛型类型参数。

public class ItemCollection<T>
{
    private List<T> items = new List<T>();

    public void Add(T item)
    {
        items.Add(item);
    }
    
    public List<T> ViewAll()
    {
        return items;
    }
}

然后您应该让您的原始 classes 扩展该基础 class 并从中删除公共代码。

如果这不仅仅是一个示例,您应该查看接口/抽象定义的合同 class:

  • 你真的需要 return 一个(可修改的)List<T> 还是 IReadOnlyList<T>ICollection<T>IEnumerable<T>Immutable* 类型足够了;更可取
  • ViewAll() 编辑的对象 return 应该根据之后应用于 ItemCollection 的修改而改变还是应该保持不变?
  • 与现有的可用集合类型相比,您的 classes 和界面有何特别之处?