2016-03-24 4 views
1

私は設計上の質問があります。私は私のプロジェクトのインターフェイス次ている -逆互換のためのインターフェイスの操作

interface ITest 
{ 
    void SayHello(); 
} 

を、それが各クライアントで、このクラスによって実装される -

class TestImpl : ITest 
{ 
    public void SayHello() 
    { 
     Console.WriteLine("Hello!"); 
     Console.ReadLine(); 
    } 
} 

今、このインターフェイスはかなりの時間のために使用されてきた、がたくさんありますこのコードを使用するクライアント。

class LibraryClass 
{ 
    private ITest test; 

    public void initialize(ITest t) 
    { 
     test = t; 
    } 

    public void Call() 
    { 
     test.SayHello(); 
     LibraryClass2 l2 = new LibraryClass2(); 
     l2.SayHelloAgain(test); 
    } 
} 

class LibraryClass2 
{ 
    public void SayHelloAgain(ITest test) 
    { 
     test.SayHello(); 
    } 
} 


class Client 
{ 
    private ITest test; 

    public void Client2Method() 
    { 
     LibraryClass l = new LibraryClass(); 
     l.initialize(new TestImpl1); 
     l.Call(); 
    } 
} 

ここで、SayHelloの書き方を変更したいと思います。私は関数の引数として名前を渡すと、ユーザーの応答を返す、それは次のようになります -

string SayHello(string name); 

私は図書館で提供されるAPIを変更する必要はありません。コードを下位互換性に保ち、新しいコールをサポートするために、これをどうやって行うことができますか?

EDIT:私が直面している実際の問題を反映するコードを修正しました。

おかげ

+0

インターフェイスのコードを制御する場合は、単にメソッド文字列SayHello(文字列名)を追加します。 ITestに – user469104

+0

いいえ、私はいません。各クライアントにはインターフェイス – Fox

+0

の独自の実装がありますが、 –

答えて

0

新しいメソッドを含む新しいインターフェイス、ITest2を作成し、それを実装を開始するようにユーザーに尋ねます。 ITestを廃止とマークすると、警告が表示されます。

Initializeの2つのオーバーロードを実装します.1つはITestとなり、もう一方はITest2となります。 testまたはtest2がnullでない場合、メソッドがそれに応じて動作するように変更します。

test?.SayHello(); 
string result = test2?.SayHello("some string"); 

あなたがリストした制約条件を満たしていれば、大したことではないかもしれませんが、おそらく最高です。

関連する問題