Предоставление различных интерфейсов из одного класса - PullRequest
1 голос
/ 15 ноября 2011

Мы пытаемся создать какой-то слой над DAL, чтобы открыть интерфейс определенных методов репозитория с использованием шаблонов.

Например:

public interface A
{
    void Do_A();
}

public interface B
{
    void Do_B();
}

public void Main()
{
     Exposer<A>.Do_A();
     Exposer<B>.Do_B();
}

Этоможно это сделать?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

С технической точки зрения это не «отдельный класс», поскольку Exposer<A> отличается от Type до Exposer<B>;однако, в конечном счете, это не сильно отличается от большинства контейнеров IoC / DI ... если бы это было, скажем, StructureMap (чисто для примера), вы могли бы подумать:

container.GetInstance<A>().Do_A();
container.GetInstance<B>().Do_B();

вы бы,Конечно, необходимо настроить контейнер, чтобы знать, откуда поступают конкретные реализации A и B!Который для StructureMap показан здесь , но есть много вариантов для выбора .

Если вы имеете в виду непосредственно , то: нет.Вы не можете иметь:

class Exposer<T> : T {...} // non-working code to implement the interface T

Вы можете , однако, имеете некоторый класс:

class Exposer : A, B {...}

и просто разыгрываете:

A a = Exposer;
a.Do_A();
B b = Exposer;
b.Do_B();
1 голос
/ 15 ноября 2011

Вы описываете IoC, когда пишете?

Exposer<A>.Do_A();

Ваш класс Exposer заставляет меня подумать о StructureMap API:

ObjectFactory.GetInstance<T>().Do_A();

Если вы хотите избавиться от ключевого слова new и войти вуниверсальный способ создания экземпляра для указанного интерфейса, посмотрите эту статью или отметьте StructureMap

1 голос
/ 15 ноября 2011

Тип Foo<T> не может реализовать (или расширить) фактический T, так как T неизвестен во время компиляции. То, что вы могли бы сделать, это выставить T как свойство и вызвать методы для него. Однако, как писал Ондрей, вопрос может быть немного неясным.

0 голосов
/ 16 ноября 2011

Чтобы выбрать, какую реализацию интерфейса вы хотите использовать при использовании данного класса, вы не используете универсальные шаблоны, вы просто приводите класс к интерфейсу:

public interface A 
{ 
    void Do_A(); 
} 

public interface B 
{ 
    void Do_B(); 
} 

public class Exposer : A, B
{
    public void Do_A() { ; }
    public void Do_B() { ; } 
}

public void Main() 
{
     // the casts are redundant here,
     // because the interface implementation
     // is implicit

     ((A)Exposer).Do_A(); 
     ((B)Exposer).Do_B(); 
} 

Если вы хотите исключить членов, которые не реализации членов данного интерфейса, используют явную реализацию:

public class Exposer : A, B
{
    void A.Do_A() { ; }
    void B.Do_B() { ; } 
}

public void Main() 
{
     // the casts are now required;
     // otherwise, you'll get a compiler error
     // telling you that the method is inaccessible

     ((A)Exposer).Do_A(); 
     ((B)Exposer).Do_B(); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...