我有以下界面:
public interface IReport
{
int ReportId {get; set;}
}
我有一个具有标识列属性的实体:
public int PaymentReportId {get; set;}
我需要PaymentReport
来实现IReport
在我的 PaymentReport.cs 中,我做了:
public int PaymentReportId {get; set;}
public int ReportId {
get => PaymentReportId;
set {} //no need to ever set this;
}
否则,编译器会抱怨没有实现设置器。
是否有一种更清洁的方法?
答案 0 :(得分:1)
我从IReport的ReportId中删除了该集合,然后在该类中实现了。
public interface IReport
{
int ReportId { get; }
}
public class PaymentReport : IReport
{
public int PaymentReportId { get; set; }
public int ReportId
{
get => PaymentReportId;
}
}
答案 1 :(得分:1)
如果您尝试遵守SOLID,则有一种称为接口隔离的原则。
接口隔离原则(ISP)规定,不应强迫任何客户端依赖其不使用的方法。
您的方法显然会违反该原理,因为类PaymentReport
确实具有属性设置程序,而该属性设置程序基本上是不需要的。
请考虑将IReport
分为IReportRead
和IReportWrite
并仅实施必要的内容。
public interface IReportRead
{
int ReportId { get; }
}
public interface IReportWrite
{
int ReportId { set; }
}
public class PaymentReport : IReportRead {//...}
这样,您就可以清晰地抽象出来,并且不会污染实现。
答案 2 :(得分:1)
正如其他人所说,最干净的方法是更改界面或拆分为
几个接口。以下是将接口分为两个示例并在get
和get, set
场景中使用它们的示例:
interface IFooGet
{
int Id { get; }
}
interface IFooSet
{
int Id { set; }
}
public class FooGet : IFooGet
{
public int Id { get; }
}
public class FooGetSet : IFooGet, IFooSet
{
public int Id { get; set; }
}
如果这不可能(也许您不拥有该接口的代码?),则在有人尝试调用该属性时,您可能会引发异常。
class PaymentReport : IReport
{
public int PaymentReportId {get; set;}
public int ReportId {
get => PaymentReportId;
set => throw new NotSupportedException();
}
}
如果将来某些代码试图调用setter并假设setter实际上确实有意义,那么set
中只是一个空的正文有时可能会导致错误隐藏https://en.wikipedia.org/wiki/Error_hiding。