C# 继承泛型接口的具体类

C# 继承泛型接口的具体类,c#,generics,interface,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&l

我希望有一个泛型接口,它有一个用作派生类的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> { ... }
interface-intentity
{
T Id{get;set;}
}
派生类可以使用它,如下所示:

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属性
//公共int Id{get;set;}
}
公共类文档:IEntity{…}
不幸的是,编译器会处理此错误:

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

我做错了什么?谢谢

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

与interface中一样,所有方法都必须实现


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

您需要为每个类实现接口,就像前面提到的:

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

public class Employee : IEntity<int>
{
    public int Id { get; set; }
}
interface-intentity
{
T Id{get;set;}
}
公共类员工:IEntity
{
公共int Id{get;set;}
}

您混淆了继承和接口实现

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

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
}
interface-intentity
{
T Id{get;set;}//尚未出现“get”和“set”的必要代码
}
界面雇员:专业性
{
//不需要重复Id属性
//它是遗传的
}
类似地,当一个类继承另一个类时:

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
}
类实体
{
public T Id{get;set;}//此处存在“get”和“set”的自动代码
}
类别雇员:实体
{
//不需要重复Id属性
//它是遗传的
}
如果要确保仅实例化派生类,则可以将基类设置为抽象类

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


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

您必须在
Employee:IEntity
中实现
int-Id
。接口是一种合同,它向其他人保证
Employee
拥有
Id
属性。你必须实现它。难道没有一个方法不需要实现这个Id吗???我创建了
entity
以减少每个实体类中的编码Id属性在这种情况下,您将需要一个抽象基类
entity
,它通过从合同中定义Id属性来实现接口。Employee类可以从基类派生。您似乎不确定实现接口和从基类派生之间的区别。您可能会签出,或者。抽象类的问题是,您只能从一个类继承。是的,属性只是特殊方法。接口属性只是声明它们是只读的还是读写的。具体的实现必须为它提供定义。