继承通用接口的具体类

时间:2018-07-29 07:42:57

标签: c# generics interface

我想要一个通用接口,该接口具有一个属性,该属性用作派生类的Id属性。

我写了如下界面:

interface IEntity<T>
{
    T Id { get; set; }
}

和派生类可以如下使用它:

public class Employee : IEntity<int>
{
    // don't need to define Id property
    // public int Id { get; set; }
}

public class Document : IEntity<string> { ... }

不幸的是,编译器遇到了以下错误:

  

“员工”未实现接口成员“ IEntity.Id”

我做错了什么?谢谢。

编辑: 虽然可接受的答案解决了问题,但@dbc注释帮助我实现了目标,如果我将interface IEntity更改为abstract class IEntity,则无需在派生类中实现Id属性。 / p>

3 个答案:

答案 0 :(得分:1)

与界面一样,必须实现所有方法!

属性只不过是方法,必须在接口int Id { get; set; }中定义时才能实现。

答案 1 :(得分:0)

您需要为每个类实现接口-如前所述:

interface IEntity<T>
{
    T Id { get; set; }
}

public class Employee : IEntity<int>
{
    public int Id { get; set; }
}

答案 2 :(得分:0)

您在混淆继承和接口实现。

当一个接口继承另一个接口时,成员将被继承,您无需重复它们:

interface IEntity<T>
{
    T Id { get; set; }     // necessary code for 'get' and 'set' not present (yet)
}
interface IEmployee : IEntity<int>
{
    // don't need to repeat Id property
    // it is inherited
}

类似地,当一个类继承另一个类时:

class Entity<T>
{
    public T Id { get; set; }     // automatic code for 'get' and 'set' exists here
}
class Employee : Entity<int>
{
    // don't need to repeat Id property
    // it is inherited
}

如果您要确保仅实例化派生类,则可以将基类设置为abstract

但是,当类(或结构)实现 和接口时,必须以某种方式实现接口的每个成员。通常由该类或结构的公共成员提供。 (该公共成员可以从基类继承!),或者偶尔通过 explicit 接口实现。

接口没有正文,只有签名。例如,get属性的setId访问器必须具有某种意义。在接口中写入T Id { get; set; }时,没有访问器的主体。但是,当您在类(或结构)中编写T Id { get; set; }时,并且没有abstractextern修饰符时,分号具有另一种含义;然后编译器会自动生成必要的访问器主体(并自动生成访问器使用的字段)。