I have an interface defined in C# that I would like to implement in
IronPython 0.7.5. Similar code works in Jython. The interface looks
like:

public interface IDocumentChangeListener {
        void StateAltered();
        void InvalidateAll();
        void InvalidateRange(int a, int b);
};

   Trying to implement the interface in IronPython like this fails:

class IDCLForward(IDocumentChangeListener):
        def __init__(self, form):
                self.form = form
        def StateAltered(self):
                print "IDCL altered"
                self.form.StateAltered()
        # ...

with a trace:

System.ArgumentException: Parent type was not extensible by the given type.
   at System.Reflection.Emit.TypeBuilder.SetParent(Type parent)
   at IronPython.AST.NewTypeMaker.CreateNewType()
   at IronPython.AST.NewTypeMaker.GetNewType(String mod, String name,
Tuple bases, IDictionary`2 dict)
   at IronPython.Objects.UserType..ctor(String mod, String name, Tuple
bases, IDictionary`2 dict)
   at IronPython.Objects.Ops.MakeClass(String mod, String name, Tuple
bases, IDictionary`2 vars)
   at __main__.Initialize() in
C:\os\sinkworld\tentacle\csharp\TentacleP.py:line 24
...

========================================

   Sliding in a concrete C# class between the interface and IronPython
class helps avoid stack traces but does not lead to the IronPython
class being called.

public class IDCL : IDocumentChangeListener {
        public IDCL() {
        }
        public virtual void StateAltered() {
                Console.Error.WriteLine("StateAltered");
        }
        public virtual void InvalidateAll() {
                Console.Error.WriteLine("InvalidateAll");
        }
        public virtual void InvalidateRange(int a, int b) {
                Console.Error.WriteLine("InvalidateRange");
        }
};

class IDCLForward(IDCL):
        def __init__(self, form):
                self.form = form

========================================

   Jython likes to have the interface __init__ed but this also upsets
IronPython.

class IDCLForward(IDCL):
        def __init__(self, form):
                IDCL.__init__(self)
                self.form = form

IronPython.Objects.PythonAttributeError: type object 'SinkWorld.IDCL'
has no attribute '__init__'
   at IronPython.Objects.Ops.GetAttr(Object o, String name)
   at __main__.__init__$f0(Object self, Object form) in
C:\os\sinkworld\tentacle\csharp\TentacleP.py:line 26

========================================

   What should I do to make this work?

   Neil
_______________________________________________
users-ironpython.com mailing list
users-ironpython.com@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to