我想要一个通用接口,该接口具有一个属性,该属性用作派生类的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>
答案 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
属性的set
和Id
访问器必须具有某种意义。在接口中写入T Id { get; set; }
时,没有访问器的主体。但是,当您在类(或结构)中编写T Id { get; set; }
时,并且没有abstract
或extern
修饰符时,分号具有另一种含义;然后编译器会自动生成必要的访问器主体(并自动生成访问器使用的字段)。