[英]I need Implement interface some methods only
在我的项目中有一个界面。 在界面中有很多方法。 我们公司的其他开发人员继承了某些类的接口并实现了我需要实现的所有方法天气。 那个时候我遇到了一些错误。 “不实现接口成员”。 我怎么解决这个问题? 例如:-
public interface IComplianceRepository
{
IList<ComplianceModel> LoadComplianceModel(Guid userId);
bool CreateCompliance(ComplianceModel complianceModel);
IList<ComplianceType> LoadComplianceType();
IList<ComplianceStatu> LoadComplianceStatus();
IList<UserDetails> LoadUsersBySchoolId(int schoolId);
Compliance GetComplianceByComplianceId(int complianceId);
bool UpdateCompliance(ComplianceModel complianceModel);
UserProfile GetUserProfileDetails(Guid userId);
FinancialCompliance GetFinancialComplianceByComplianceId(int ComplianceId);
void GetComplianceModelByComplianceId(ComplianceModel complianceModel, int complianceId);
}
许多开发人员使用上述接口并实现all方法。 但我不想实现以下方法
IList<ComplianceModel> LoadComplianceModel(Guid userId);
bool CreateCompliance(ComplianceModel complianceModel);
我怎么解决这个问题?
你不能。 存在Interface
的唯一原因是整个合同必须在实现它的类中实现。
如果您不能或不想更改接口,则应实现这些方法并抛出NotSupportedException
。 我建议为此使用显式接口继承,因此虚拟方法不会出现在类中。
void IList<ComplianceModel> IComplianceRepository.LoadComplianceModel(Guid userId)
{
throw new NotSupportedException();
}
作为BCL中的示例,您可以查看ReadOnlyCollection.ICollection.Add方法 。 它是一个显式的接口实现,它会抛出NotSupportedException
。 这也是糟糕设计的一个例子,证明在.net 4.0中缺少IReadOnlyList<T>
接口。
真正的解决方案是重构代码。 拥有完全实现的较小接口。 看一下Interface segregation原则 :
接口隔离原则(ISP)规定不应强迫客户端依赖它不使用的方法。 ISP将非常大的接口拆分为更小和更具体的接口,以便客户端只需知道它们感兴趣的方法。
创建两个接口,父和子。 家长会有你想要的,孩子会有其他人。
public interface Parent {
// parent methods here
}
public interface Child : Parent{
// child methods here
}
如果类实现了接口,则必须实现该接口上的所有功能。 接口是功能合同,因此声称满足该合同的任何内容都必须实际这样做。 现在,您无需在合同中有意义地实施所有内容。 例如,对于您知道不会使用的方法执行此操作的标准方法是:
public void SomeMethodIKnowIWontUse()
{
throw new NotSupportedException();
}
因此,如果实际使用该方法,那么它将抛出异常。 (当你认为它不会被使用时,这表明你错了,你应该实现它。)
请记住,这很快就会导致“代码异味”。 如果你有很多不需要实现的对象成员那么显然设计是错误的......
这里的另一种可能性是界面设计不正确。 也许它试图为太多人做太多事情? 这可能违反了单一责任原则 。 例如,使用此界面:
public interface CatchAll
{
void FunctionForOneResponsibility();
void FunctionForCompletelyDifferentResponsibility();
}
使用非常人为的名称,很明显这个界面有太多的责任。 它应该是这样的:
public interface OneResponsibilitySatisfier
{
void FunctionForThisResponsibility();
}
public interface AnotherResponsibilitySatisfier
{
void FunctionForThisOtherResponsibility();
}
没有规则说你需要有很少的接口,或者接口需要有很多成员。 每个人都应该为其责任提供有意义的功能合同,仅此而已。 如果巧合的话,你有一个用于满足这两个职责的类,它可以实现两个接口:
public class CrossCuttingObject : OneResponsibilitySatisfier, AnotherResponsibilitySatisfier
{
public void FunctionForThisResponsibility() { }
public void FunctionForThisOtherResponsibility() { }
}
接口作为接口的实现者和用户之间的契约存在。 用户/消费者要求实施所有方法。 首先,问问自己,没有这些方法的实现是否仍然有用。 如果是这样,请问自己是否需要继承此界面。
如果在此反射之后,您仍然有正当理由在不实现所有方法的情况下实现此接口,则可以创建存根方法:
IList<ComplianceModel> LoadComplianceModel(Guid userId)
{
throw NotSupportedException();
}
或者,更危险,但可能破坏性更小:
IList<ComplianceModel> LoadComplianceModel(Guid userId)
{
return null;
}
这是接口隔离的理想方案。 请参考此设计原则(oodesign.com/interface-segregation-principle.html)您需要分离合同,不要将所有鸡蛋放在一个篮子里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.