1

Here is the situation. We have two printers from different providers (manufacturers). We want top-level code to stay unaware of details about providers and just use uniform API. So I have started to extract an interface.

public interface IPrinterProvider {
    bool Connect(string comPort);
    bool IsConnected();
}

OK. Now, I realized that one printer requires Password property, but the other does not. So, what should I do?

And once more. As I understand, I'll have one or a couple of interfaces and a couple of implementors. But how will a caller work? Should I create a separate class, which might not implement any interfaces? For instance:

public class CommonPrinterProvider {
    private IPrinterProvider printerProvider;
    public CommonPrinterProvider(IPrinterProvider printerProvider) {
        this.printerProvider= printerProvider;
    }
}

So, two questions in total.

4

5 に答える 5

5

プリンターの「設定」(より正確には「接続設定」)を別のクラスにカプセル化し、interface. ややこのように:

public class PrinterSettings {
    public string Password { get; set; }
    public int Port { get; set; }
    /* .. others .. */
}

public interface IPrinterProvider {
    void Initialize(PrinterSettings settings);
    bool Connect(string comPort);
    bool IsConnected();
}

次に、各実装は、適切と思われる方法で設定を処理できます。

于 2013-08-01T09:20:07.580 に答える
1

インターフェイスをできるだけ統一することをお勧めします。確かにインターフェイスの実装 (クラス) には違いがありますが、それらの処理は戦略に隠されている必要があります。呼び出し元はインターフェイスで動作する必要があり、インスタンス化をIoCレイヤーに配置することをお勧めします。次のステップは、特定の実装に必要なすべての設定を提供するサービスを作成することです。各サービス タイプは、各プロバイダーによって使用されます。その後、素敵なSOCができます。このレベルでは、同じインターフェースを持つ並列構造があり、Abstract Factoryを実装することは完全に適合します。

于 2013-08-01T09:17:40.893 に答える
0

インターフェイスをそのままにして、パスワードを受け取るクラスと受け取らないクラスを実装することができます。

public class PasswordPrinterProvider : IPrinterProvider
{
     private readonly string password;
     public PasswordPrinterProvider(string password)
     {
         this.password = password;
     }
     public bool Connect(string comPort) {...}
     public bool IsConnected() {...}
}
于 2013-08-12T11:13:09.940 に答える
-1

このようなものを使用できます...ファクトリパターンに多少似ています。

抽象クラス:

public abstract class PrinterProvider
{
    public string Password{get;private set;}
    public abstract bool connect(string port);
    public bool IsConnected()
    {
        return true;
    }
}

コンクリートクラス 1:

public class PrinterCompany1 : PrinterProvider
{
    public override bool connect(string port)
    {
        // some code here
        // If it needs password
        return true;
    }
}

コンクリートクラス 2:

public class PrinterCompany2:PrinterProvider
{
    // Printer that doesnt need password
    public override bool connect(string port)
    {
        return false;
    }
}

そして最後に、動的ポリモーフィズムの助けを借りて、これらすべての具象クラスにアクセスします...

        PrinterProvider provider;

        // First provider
        provider = new PrinterCompany1();
        provider.connect("temp");
        // Second provider
        provider = new PrinterCompany2();
        provider.connect("temp2");

より詳細な説明については、工場のパターンを参照してください...

于 2013-08-01T09:39:12.970 に答える