Реализовать вложенный интерфейс общего родительского класса с помощью ironpython

Я не хочу реализовывать следующий интерфейс С#/.Net с IronPython:

public static class Consumes<TMessage> where TMessage : class
{
   public interface All
   {
       void Consume(TMessage message);
   }
}

Это код Python, который я пробовал до сих пор:

class TestMessage(object):
     pass

class TestConsumer(Consumes[TestMessage].All):
     def Consume(self, message):
         pass

Из этого я получаю следующее исключение:

Ошибка типа: TestConsumer: невозможно наследовать от открытого универсального экземпляра MassTransit.Consumes`1+All[TMessage]. Поддерживаются только закрытые экземпляры.

Допустимое определение класса C# для реализации этого интерфейса выглядит следующим образом:

public class TestConsumer : Consumes<TestMessage>.All
{
    public void Consume(TestMessage msg) { }
}

Так нельзя ли реализовать такое в IronPython? Или я делаю неправильно?

Заранее спасибо!


person Joachim Rosskopf    schedule 03.05.2013    source источник
comment
Не могли бы вы либо предоставить IConsumer, либо удалить его из своего образца. Я не ожидаю, что это будет актуально, но кто знает.   -  person Simon Opelt    schedule 05.05.2013
comment
Удалил. Это просто пустой маркерный интерфейс, используемый внутри Masstransit. Спасибо за подсказку!   -  person Joachim Rosskopf    schedule 05.05.2013


Ответы (1)


Похоже на реализацию вложенного интерфейса как

class TestConsumer(Consumes[TestMessage].All):

неправильно связывает параметр типа TMessage, хотя этого можно было бы ожидать из синтаксиса. Если тип указан в конце («для интерфейса вместо окружающего класса»), он работает так, как ожидалось:

class TestConsumer(Consumes.All[TestMessage]):

Что также сработает, так это явный импорт интерфейса All и использование его в виде отдельного универсального интерфейса:

from MyLib.Consumes import All
class TestConsumer(All[TestMessage]):

Не кажется очевидным, правильно ли это поведение/определено таким образом, или есть ошибка в генерация типа (кроме опечатки "inhert") или способом определения/привязки общих параметров. Похоже, также принято связывать параметр дважды:

class PyTestConsumer(Consumes[String].All[String]):

даже с разными значениями, что не имеет особого смысла, если смотреть на это с точки зрения .NET:

class PyTestConsumer(Consumes[List[String]].All[String]):
person Simon Opelt    schedule 05.05.2013
comment
Итак, если я правильно вас понял, это ошибка в текущей реализации генерации типов IronPython. и вложенный интерфейс в универсальном классе не может быть реализован. К сожалению, я не могу изменить класс или интерфейс, как в стороннем коде. В любом случае спасибо за грамотный ответ! - person Joachim Rosskopf; 05.05.2013
comment
Нет, я предположил, что может быть ошибка. Второй и третий фрагменты кода определения моего класса должны позволить вам реализовать All-интерфейс для вашего варианта использования. - person Simon Opelt; 05.05.2013
comment
Ну ладно, я думаю, что это ошибка. Но, как вы предложили, работает второе и третье решение. - person Joachim Rosskopf; 09.05.2013
comment
И просто интересное примечание: я знаю, что не реализуйте интерфейс напрямую в python-скрипте, а используйте github.com/ekonbenefits/impromptu-interface, чтобы применить область сценария, которая определяет правильные методы и свойства, для создания динамического прокси-сервера, реализующего интерфейс .Net. - person Joachim Rosskopf; 09.05.2013