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

时间:2013-01-24 12:09:04

标签: c#

我们希望在属于类库的类中对接口执行“部分显式实现”。通过部分显式实现,我的意思是隐式地实现接口的某些成员,并明确地实现相同接口的剩余成员。 请告诉我们可能需要注意的问题。

更具体地说,假设我们有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等隐式实现了DriverIdentityOperation,并明确地实现了Utility

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

我们希望了解在这种情况下部分显式实现的任何可能的副作用/后果。请告诉我们您的评论。

提前致谢!!

2 个答案:

答案 0 :(得分:1)

当然你需要一个界面?抽象类怎么样(因为我觉得在你的情况下驱动程序更像是“类型”而不是“行为”)。

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

    protected abstract DriverUtility Utility { get; }
}

如果您打算从类外部访问“Utility”,那么您可以添加“内部”访问修饰符(但在这种情况下,您应该考虑将其声明为“公共”)。

答案 1 :(得分:1)

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

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

您还可以考虑在TUtillity中创建接口 covariant ,在声明中添加“out”:interface IDriver<out TUtillity>