2016-03-24 2 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, один принимает ITest, а другой принимает ITest2. Измените свои методы, чтобы действовать соответственно, если test или test2 не равно нулю.

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

Невероятно, но, вероятно, лучшее, что вы можете сделать, учитывая ограничения, которые вы указали.

Смежные вопросы