держать код организованным с использованием универсальных типов - PullRequest
1 голос
/ 07 декабря 2011

Мне нравится хранить вещи отдельно при программировании.Это одна из причин, почему наследование важно, я считаю.

Я использую файл DLL, который состоит из класса, который я не могу изменить.Файл DLL содержит ClassA для иллюстрации моего примера.

class Program
{
    static void Main(string[] args)
    {
        ClassA object1 = new ClassA();

        SomeMethod<ClassA>(object1 ); // error because " a does not implement ITemp"
    }

    static T SomeMethod<T>(T input)
        where T:ITemp // make sure input has a method MyCustomMethod
    {

        input.MyCustomMethod();

        return input;
    }
     // create this interface so that compiler does not complain when
     // calling MyCustomMethod in method above

    interface ITemp
    {
        void MyCustomMethod();
    }

}


// classA is a sealed class in a dll file that I cannot modify
public class ClassA
{
    public void MyCustomMethod()
    {

    }
}

Почему возникает ошибка, если object1 реализует интерфейс ITemp!У object1 есть метод MyCustomMethod ()

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

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

ClassA не реализует интерфейс ITemp. Тот факт, что у него есть метод с тем же именем и сигнатурой, что и у метода в интерфейсе ITemp, не означает, что он реализует этот интерфейс. Класс должен быть объявлен для его явной реализации.

Поскольку вы не можете расширить ClassA, лучшее, что я могу придумать, это обернуть его классом адаптера:

public ClassB : ITemp {
    protected ClassA classAInstance;

    public ClassB( ClassA obj ) {
        classAInstance = obj;
    }

    public void MyCustomMethod() {
        classAInstance.MyCustomMethod();
    }
}

Тогда в вашем основном методе:

static void Main(string[] args)
{
    ClassA object1 = new ClassA();

    SomeMethod<ClassB>(new ClassB(object1));
}
1 голос
/ 07 декабря 2011

Вы пытаетесь использовать duck, набрав . C # не поддерживает это вообще вне типа dynamic. ClassA должен был бы реализовать интерфейс, как вы заметили, он не может и не может быть создан. Вы можете обернуть класс прокси, но это может быть или не быть хорошей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...