1

IronPython で次の C#/.Net インターフェイスを実装したくありません。

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

これから、次の例外が発生します。

TypeError: TestConsumer: 開いている一般的なインスタンス化 MassTransit.Consumes`1+All[TMessage] から継承できません。閉じたインスタンス化のみがサポートされています。

このインターフェイスを実装するための有効な C# クラス定義は次のようになります。

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

では、IronPython でこの種のものを実装することはできないのでしょうか? それとも私は間違っていますか?

前もって感謝します!

4

1 に答える 1

0

ネストされたインターフェースを次のように実装するように見えます

class TestConsumer(Consumes[TestMessage].All):

TMessage構文から予想される場合でも、型パラメーターを正しくバインドしません。タイプが最後に提供されている場合(「周囲のクラスではなくインターフェース用」)、期待どおりに機能するようです:

class TestConsumer(Consumes.All[TestMessage]):

また、インターフェイスを明示的にインポートしAll、スタンドアロンの汎用インターフェイスのように使用することもできます。

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

この動作が正しい/そのように定義されているかどうか、または型生成(「継承」タイプミス以外) にバグがあるか、またはジェネリックパラメーターが定義/バインドされている方法にバグがあるかどうかは明らかではないようです。パラメータを2回バインドすることも受け入れられているようです:

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

.NET の観点から見てあまり意味のない異なる値を使用しても、次のようになります。

class PyTestConsumer(Consumes[List[String]].All[String]):
于 2013-05-05T14:41:29.603 に答える