Как использовать универсальный делегат в интерфейсе - PullRequest
0 голосов
/ 30 сентября 2011

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

Ниже приведен код, описывающий то, что я пытаюсь достичь.

public delegate void GenericMethod<T>(T arg);
public delegate void StringMethod(string str);
public delegate void ByteMethod(byte bt);

public interface ITest
{
    GenericMethod<T> someMethod;    
}

public class TestA : ITest
{
    public GenericMethod<string> someMethod
    {
         get 
         {
               return stringMethod; //which is of type StringMethod(string str), defined above
         }
    }
}

public class TestB : ITest
{
    public GenericMethod<byte> someMethod
    {
         get 
         {
               return byteMethod; //which is of type ByteMethod(byte bt);, defined above
         }
    }
}

Это возможно?Или нельзя так переключать делегатов?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2011
public delegate void GenericMethod<T>(T arg);
public delegate void StringMethod(string str);
public delegate void ByteMethod(byte bt);

public interface ITest<T>
{
    GenericMethod<T> someMethod { get; };
}

public class TestA : ITest<string>
{
    public GenericMethod<string> someMethod
    {
        get
        {
            return stringMethod; //which is of type StringMethod(string str), defined above
        }
    }
}

public class TestB : ITest<byte>
{
    public GenericMethod<byte> someMethod
    {
        get
        {
            return byteMethod; //which is of type ByteMethod(byte bt);, defined above
        }
    }
}
0 голосов
/ 30 сентября 2011

Вы не можете сделать это из-за принципов наследования.Все, что работает в ITest, должно работать в производных классах / интерфейсах.Это означает, что если я могу использовать

GenericMethod<int> someMethod

(посмотрите на int) в ITest, я должен иметь возможность использовать его в TestA и TestB.Вы пытаетесь игнорировать это ограничение

0 голосов
/ 30 сентября 2011

Я не думаю, что это возможно без создания универсального интерфейса.Общая реализация будет выглядеть так:

public interface ITest<T>
{
    GenericMethod<T> someMethod;
}

Или, если вы действительно хотите иметь неуниверсальный интерфейс, используйте:

public interface ITest
{
    GenericMethod<object> someMethod;
}

Вы также можете взглянуть на два интерфейса IEnumerable и IEnumerable<T>, чтобы увидеть, как можно комбинировать как универсальные, так и неуниверсальные интерфейсы.Просто реализуйте неуниверсальный интерфейс явно для использования, когда вам не нужен конкретный тип.

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