.NET 中接口的部分显式实现

本文关键字:实现 接口 NET | 更新日期: 2023-09-27 17:55:51

我们想在属于类库的类中对接口进行"部分显式实现"。通过部分显式实现,我的意思是隐式实现接口的某些成员和显式实现同一接口的其余成员。请让我们知道我们需要注意的可能问题。

更具体地说,假设我们有IDriver定义如下的接口。IDriver接口定义了所有驱动程序的基本功能。

interface IDriver
{
    IDriverIdentity DriverIdentity { get; }
    IDriverOperation Operation { get; }
    IDriverUtility Utility { get; }
}
public class MyDriver1 : IDriver
{
    // Implement the first and second member of IDriver implicitly
    public IDriverIdentity DriverIdentity
    {
        get
        {
            // return a IDriverIdentity object that user can use to assess Identity operations...
        }
    }
    public IDriverOperation Operation
    {
        get
        {
            // return a IDriverOperation object that user can use to access DriverOperation related properties and members..
        }
    }
    // Implement the last member of interface explicitly
    IDriverUtility IDriver.Utility
    {
        get
        {
            // return a IDriverUtility object that user can use to access fundamental utility operations that is mandated for every "Driver" object...
        }
    }
    public MyDriver1Utility Utility
    {
        get
        {
            // return MyDriver1Utility object that user can use to access utility operations available in this driver ...
        }
    }
}

类似地,我们假设我们有 MyDriver2MyDriver3 等,它们隐式地、Utility地实现DriverIdentityOperation

在所有Driver类中,我们都希望隐式实现DriverIdentityOperation,以便用户在使用不同的Driver对象时对DriverIdentityOperation具有一致的视图。但是,我们希望显式实现Utility成员,并在从驱动程序对象访问时提供特定于该驱动程序的其他实用工具操作。

我们希望了解在这种情况下部分显式实现的任何可能的副作用/后果。请让我们知道您的意见。

提前感谢!!

.NET 中接口的部分显式实现

确定需要接口吗?抽象类怎么样(因为我认为在您的情况下,驱动程序更像是"类型"而不是"行为")。

public abstract class Driver
{
    public abstract DriverIdentity Identity { get; }
    public abstract DriverOperation Operation { get; }
    protected abstract DriverUtility Utility { get; }
}

如果您打算从类外部访问"Utility",则可以添加"内部"访问修饰符(但在这种情况下,您实际上也应该考虑将其声明为"public")。

也许你应该使用泛型,比如

interface IDriver<TUtillity> where TUtillity : IDriverUtility
{
  IDriverIdentity DriverIdentity { get; }
  IDriverOperation Operation { get; }
  TUtillity Utility { get; }
}

你也可以考虑在 TUtillity 中使接口协变,即在声明中放一个"out":interface IDriver<out TUtillity>