A question about subclassing, virtual methods, C#/IP interop, etc in IronPython-0.9.4.  I have a library of two classes Helper & Master (greatly simplified from my actual situation, but analagous):

 

using System;

namespace TestLib

{

    public class Helper

    {

        int _id;

        public Helper(int id)

        {

            _id = id;

        }

        public void DoSomething()

        {

            Console.WriteLine("Helper”);

        }

    }

 

    public class Master

    {

        protected virtual Helper CreateHelper(int id)

        {

            return new Helper(id);

        }

        public void DoSomething()

        {

            Helper helper = CreateHelper(0);

            helper.DoSomething();

        }

    }

}

 

Master has a factory-style method that creates a helper, and then invokes a method on it.  I want to insert some throw-away behavior, by subclassing both Master and Helper, so that FooMaster creates a FooHelper, and then invokes the FooHelper version of DoSomething.

 

from TestLib import *

 

class FooHelper(Helper):

    def __init__(self, id):

        self._id = id

    def DoSomething(self):

        print "FooHelper"

 

class FooMaster(Master):

    def CreateHelper(self, id):

        return FooHelper(id)

 

# === Main ==================

fooMaster = FooMaster()

fooMaster.DoSomething()

 

I expect this to print out “FooHelper”. Instead it prints out “Helper”.

 

Note that if I were to define the superclasses Helper/Master in Python instead of C#, everything works like a charm, and it prints out “FooHelper”:

 

class Helper:

    _id = 0

    def __init__(self, id):

        self._id = id;

    def DoSomething(self):

        print "Helper"

 

class Master:

    def CreateHelper(self, id):

        return Helper(id)

    def DoSomething(self):

        self.CreateHelper(10).DoSomething()

 

This leads me to believe it is impossible for a C# object to call a Python method that overrides a virtual method.  However, also note that if I define the Helper class to be abstract in C#, it also works fine and I see “FooHelper”.

 

using System;

using System.Text;

 

namespace TestLib

{

    public abstract class Helper

    {

        int _id;

        public Helper(int id)

        {

            _id = id;

        }

        public abstract void DoSomething();

    }

 

    public class Master

    {

        protected virtual Helper CreateHelper(int id)

        {

            return null;

        }

        public void DoSomething()

        {

            Helper helper = CreateHelper(0);

            helper.DoSomething();

        }

    }

}

 

Furthermore, when I simplify things even further, it also works the way I’d expect:

 

public class Helper

{

    public Helper(int id) { }

    public virtual void DoSomething() { Console.WriteLine("Helper"); }

}

 

public class Master

{

    public Master(Helper helper) { helper.DoSomething();  }

}

 

class FooHelper(Helper):

    def __init__(self, id): pass

    def DoSomething(self): print "FooHelper"

 

Can anybody tell me what’s going on?  Is this a bug in IronPython or am I doing something wrong?

 

Many thanks,

 

Michael

 

 

_______________________________________________
users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to