在我的项目中有一个界面。在界面中有很多方法。我们公司的其他开发人员继承了某些类的接口并实现了我需要实现的所有方法天气。那个时候我遇到了一些错误。 “不实现接口成员”。我怎么解决这个问题? 例如: -
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);
我该如何解决这个问题?
答案 0 :(得分:6)
你做不到。 Interface
存在的唯一原因是整个合同必须在实现它的类中实现。
答案 1 :(得分:5)
如果您不能或不想更改界面,则应实现这些方法并抛出NotSupportedException
。我建议为此使用显式接口继承,因此虚拟方法不会出现在类中。
void IList<ComplianceModel> IComplianceRepository.LoadComplianceModel(Guid userId)
{
throw new NotSupportedException();
}
作为BCL的一个例子,您可以查看ReadOnlyCollection.ICollection.Add Method。它是一个显式的接口实现,它抛出NotSupportedException
。这也是糟糕设计的一个例子,证明.net 4.0中缺少IReadOnlyList<T>
接口。
真正的解决方案是重构您的代码。拥有完全实现的较小接口。看看Interface segregation principle:
接口隔离原则(ISP)规定不应强制客户端依赖它不使用的方法。 ISP将非常大的接口拆分为更小和更具体的接口,以便客户只需知道它们感兴趣的方法。
答案 2 :(得分:2)
创建两个接口,父级和子级。 父母将拥有你想要的,孩子将有其他人。
public interface Parent {
// parent methods here
}
public interface Child : Parent{
// child methods here
}
答案 3 :(得分:1)
如果类实现了接口,则必须在该接口上实现所有功能。接口是功能合同,因此声称满足该合同的任何内容都必须实际这样做。现在,您不必有意义地实现该合同中的所有内容。例如,为您知道不会使用的方法执行此操作的标准方法是:
public void SomeMethodIKnowIWontUse()
{
throw new NotSupportedException();
}
因此,如果实际使用该方法,那么它将抛出异常。 (当你认为它不会被使用时,这表明你错了,你应该实现它。)
请记住,这很快就会导致“代码异味”。如果你有很多不需要实现的对象成员那么显然设计是错误的......
此处的另一种可能性是界面设计不正确。也许它试图为太多人做太多事情?这可能违反了Single Responsibility Principle。例如,使用此界面:
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() { }
}
答案 4 :(得分:0)
接口作为接口的实现者和用户之间的契约存在。用户/消费者要求实施所有方法。首先,问问自己,没有这些方法的实现是否仍然有用。如果是这样,请问自己是否需要继承此接口。
如果经过这次反思,你仍然有充分的理由在没有实现所有方法的情况下实现这个接口,你可以创建存根方法:
IList<ComplianceModel> LoadComplianceModel(Guid userId)
{
throw NotSupportedException();
}
或更危险,但可能破坏性更小:
IList<ComplianceModel> LoadComplianceModel(Guid userId)
{
return null;
}
答案 5 :(得分:0)
这是界面隔离的理想方案。请参考此设计原则(oodesign.com/interface-segregation-principle.html)您需要将合同分开,不要将所有鸡蛋放在一个篮子里。