我只需要实现接口的一些方法

Gay*_*aya 3 c# asp.net oop interface

在我的项目中有一个界面.在界面中有很多方法.我们公司的其他开发人员继承了某些类的接口并实现了我需要实现的所有方法天气.那个时候我遇到了一些错误."不实现接口成员".我怎么解决这个问题?例如:-

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);
    }
Run Code Online (Sandbox Code Playgroud)

许多开发人员使用上述接口并实现all方法.但我不想实现以下方法

    IList<ComplianceModel> LoadComplianceModel(Guid userId);
    bool CreateCompliance(ComplianceModel complianceModel);
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Jcl*_*Jcl 6

你不能.存在的唯一原因Interface是整个合同必须在实现它的类中实现.

  • 也就是说,当你确定没有调用某些方法时,处理它的常用方法是实现这些方法并在它们上面抛出一个'NotImplementedException`,但是**,让你的类中的那些方法生产是不好的做法代码(你显然是*不*在你的类中实现该接口,因此应该拆分正确的接口,或者让它们从不太复杂的接口继承) (3认同)

Cod*_*aos 5

如果您不能或不想更改界面,您应该实现这些方法并抛出一个NotSupportedException.我建议为此使用显式接口继承,因此虚拟方法不会出现在类中.

void IList<ComplianceModel> IComplianceRepository.LoadComplianceModel(Guid userId)
{
    throw new NotSupportedException();
}
Run Code Online (Sandbox Code Playgroud)

作为BCL中的示例,您可以查看ReadOnlyCollection.ICollection.Add方法.这是一个显式的接口实现,它抛出NotSupportedException.这也是糟糕设计的一个例子,证明了IReadOnlyList<T>.net 4.0中缺少界面.


真正的解决方案是重构代码.拥有完全实现的较小接口.看一下Interface segregation原则:

接口隔离原则(ISP)规定不应强迫客户端依赖它不使用的方法.ISP将非常大的接口拆分为更小和更具体的接口,以便客户端只需知道它们感兴趣的方法.