关于C#:继承通用接口的具体类

Concrete class which inherites a generic interface

我想要一个通用接口,它有一个用作派生类的ID属性的属性。

我写的界面如下:

1
2
3
4
interface IEntity<T>
{
    T Id { get; set; }
}

派生类可以使用它,如下所示:

1
2
3
4
5
6
7
public class Employee : IEntity<int>
{
    // don't need to define Id property
    // public int Id { get; set; }
}

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

不幸的是,编译器会处理此错误:

'Employee' does not implement interface member 'IEntity.Id'

我做错了什么?谢谢。

编辑:虽然接受的答案解决了这个问题,@dbc注释帮助我实现了我的目标,但是如果我将interface IEntity更改为abstract class IEntity,就不需要在派生类中实现id属性。


在接口中,必须实现所有方法!

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


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

当一个接口继承另一个接口时,成员将被继承,并且您不会重复它们:

1
2
3
4
5
6
7
8
9
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
}

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

1
2
3
4
5
6
7
8
9
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

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

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


您需要为每个类实现接口-正如前面提到的那样:

1
2
3
4
5
6
7
8
9
interface IEntity<T>
{
    T Id { get; set; }
}

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