4

クラス ライブラリの一部であるクラスで、インターフェイスの「部分的な明示的な実装」を行いたいと考えています。部分的な明示的な実装とは、インターフェイスの一部のメンバーを暗黙的に実装し、同じインターフェイスの残りのメンバーを明示的に実装することを意味します。注意が必要な可能性のある懸念事項をお知らせください。

より具体的に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 ...
        }
    }
}

同様に、暗黙的および明示的にandを実装する 、 などがあるMyDriver2とします。MyDriver3DriverIdentityOperationUtility

すべてのクラスで、ユーザーがさまざまなオブジェクトを使用しているときに一貫したビューを使用できるように、 暗黙的Driverに実装したいと考えています。ただし、明示的に実装し、ドライバー オブジェクトからアクセスするときに、そのドライバーに固有の追加のユーティリティ操作を提供したいメンバーです。DriverIdentityOperationDriverIdentityOperationDriverUtility

このシナリオでの部分的な明示的な実装の考えられる副作用/結果を理解しようとしています。コメントをお知らせください。

前もって感謝します!!

4

2 に答える 2

1

確かにインターフェースが必要ですか?抽象クラスはどうですか(あなたの場合、ドライバーは「動作」ではなく「タイプ」であると思うからです)。

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

    protected abstract DriverUtility Utility { get; }
}

クラスの外部から「ユーティリティ」にアクセスする場合は、「内部」アクセス修飾子を追加できます (ただし、この場合、「パブリック」と宣言することも検討する必要があります)。

于 2013-01-24T12:49:33.423 に答える
1

たぶん、次のようなジェネリックを使用する必要があります

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

また、インターフェースをで共変にすることを検討することもできます。TUtillityつまり、宣言に「out」を入れますinterface IDriver<out TUtillity>

于 2013-01-24T12:49:52.740 に答える