2015-06-25 1 views
0

Фактически, я не очень забочусь о полученных конечных точках здесь. Все, что мне нужно, - это основа. Я просто хочу, чтобы иметь возможность проходить в любой IClient и использовать его метод, независимо от того, что производная конечная точка.Общий интерфейс <T> как параметр конструктора для любого производного T

Отказ от ответственности: очень возможно, что, пытаясь удалить лишние вещи, я упростил это не совсем то же самое.

У меня есть следующий конструктор

public SomeClass(????? client) 
    { 
     _client = client; 
    } 

    public SomeMethod<TEndPoint>(SpecialObject o, TEndPoint e) 
    where TEndPoint: Endpoint 
    { 
     Validate(o); 
     //Do OtherStuff 
     _client.UploadToClient(o, e) 
    } 

Интерфейс выглядит следующим образом

public interface IClient<TEndpoint> where TEndpoint: Endpoint 
    { 
     TEndpoint UploadToClient(obj o, endpoint e) 
    } 

И у меня есть несколько реализаций

public class Client1: IClient<Endpoint1> 
public class Client2: IClient<Endpoint2> 

Существуют ли какие-либо шаблоны/примеры, чтобы получить меня к моменту использования универсального интерфейса в качестве параметра без указания конкретного t Ype?


Добавление, я могу разработать вокруг некоторых вещей, действительно главная цель состоит в том, что я просто не хочу, чтобы сделать SomeCase родовым, но не хочу, чтобы иметь возможность чисто и динамично принимать что-либо, что реализует IClient < >.

ответ

1

Я не вижу, как это может работать. Не было бы способа остановить это.

SomeClass myInstance = new SomeClass(new Client1()); 
Endpoint2 e2 = new Endpoint2(); 
myInstance.SomeMethod<Endpoint2>(o, e2); 

Обратите внимание, что myInstance может обрабатывать только Endpoint1 из-за своей конструкции, но это позволяет мне называть SomeMethod с помощью Endpoint2, даже если клиент не сможет. Если вы готовы отказаться от безопасности статического типа, вы можете просто объявить все dynamic и назвать это днем.

+0

Я определенно вижу проблему, которую вы описываете. Я оставил неправильное количество деталей. Я собираюсь немного изменить вопрос, потому что вы правы. Тем не менее, Im фактически не ближе к решению, так как я хочу некоторую безопасность типов. – Seth

+0

Я не верю, что возможно иметь тип безопасности типа, который вы хотите, сохраняя только один не общий «SomeClass». – recursive

1

Предполагая, что ваш интерфейс может быть изменен. Может ли следующее решить вашу проблему?

public interface IClient 
{ 
    void UploadToClient<TEnd>(obj o, TEnd endpoint) where TEnd: Endpoint; 
} 
+0

Я могу, но реализациям на самом деле в некоторых случаях нужна оригинальная реализация. Это подтолкнуло бы редизайн по дороге. – Seth

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