如何在下面的代码中实现接口?
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 和界面有何特别之处?
我想实现一个可以在 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 和界面有何特别之处?