using System;namespace xumh
{
    public class MyClass
    {
        public MyClass()
        {            
            Console.WriteLine("MyClass:默认构造函数");
        }
        public MyClass(int a, int b)
        {
            Console.WriteLine("MyClass带参构造:a={0}, b={1}.", a, b);
        }
    }
    
    public class MyClass2 : MyClass
    {
        public MyClass2()
        {
            Console.WriteLine("MyClass2:默认构造函数");
        }
        public MyClass2(int a, int b)
        {
            Console.WriteLine("MyClass2带参构造:a={0}, b={1}.", a, b);
        }
    }    public class MyClass3 : MyClass2
    {        public MyClass3()
        {
            Console.WriteLine("MyClass3:默认构造函数");
        }
        public MyClass3(int a, int b)
        {
            Console.WriteLine("MyClass3带参构造:a={0}, b={1}.", a, b);
        }
    }    public class runMyApp
    {
        static void Main()
        {
            MyClass3 my = new MyClass3(3,4);
        }
    }
}输出如下:
MyClass:默认构造函数
MyClass2:默认构造函数
MyClass3带参构造:a=3, b=4.我想输出顺序为 MyClass3-MyClass2-MyClass1 Java 的顺序
有无办法?

解决方案 »

  1.   


    我只能告诉你一点,Java绝对不可能是这个顺序——子类的构造函数在基类的之前调用。如果你非要坚持这一点,请你给出Java代码。
      

  2.   

    胡扯的人胡扯的帖子。
    想必你对JAVA同样也是一窍不通。
    如果你觉得JAVA是那样的,就出代码吧。
      

  3.   

    应该是这个问题as3---我的super不放在第一行,就是3-2,1这个顺序。
    我想问问c#怎么设置为这个顺序。class MyClass2 extends MyClass1{


    public function MyClass2(a:int,b:int):void{

    trace("myclass2");
    super(a,b);

    }
    }
    -----
    完整测试代码as3 package 
    {
    import flash.display.Sprite; public class Main extends Sprite
    {
    public function Main()
    {

    new MyClass3(1, 2);
    }
    }
    }
    class MyClass1{


    public function MyClass1(a:int,b:int):void{
    trace("myclass1");
    }
    }
    class MyClass2 extends MyClass1{


    public function MyClass2(a:int,b:int):void{

    trace("myclass2");
    super(a,b);

    }
    }
    class MyClass3  extends MyClass2{


    public function MyClass3(a:int,b:int):void{

    trace("myclass3");
    super(a,b);
    }
    }
      

  4.   

    as3是flash编程语言,不是java。
    C#中应该实现不了。
    public MyClass2(int a, int b)
    {
        Console.WriteLine("MyClass2带参构造:a={0}, b={1}.", a, b);
    }
    等价于
    public MyClass2(int a, int b):base()
    {
        Console.WriteLine("MyClass2带参构造:a={0}, b={1}.", a, b);
    }
    也就是说MyClass2的构造函数会先执行子类的构造函数的。
      

  5.   

    就如u011303459所说,.Net中基类实例构造函数就是会先于子类的实例构造函数执行,这个应该没法更改。
    我有个方法也许能实现楼主的需求:    public class MyClass
        {
            public MyClass()
            {
                Constructor();
            }
            protected virtual void Constructor()
            {
                Console.WriteLine("MyClass:默认构造函数");
            }
        }
        public class MyClass2 : MyClass
        {
            protected override void Constructor()
            {
                Console.WriteLine("MyClass2:默认构造函数");
                base.Constructor();
            }
        }
        public class MyClass3 : MyClass2
        {
            protected override void Constructor()
            {
                Console.WriteLine("MyClass3:默认构造函数");
                base.Constructor();
            }
        }
        public class runMyApp
        {
            static void Main()
            {
                MyClass3 my = new MyClass3();
            }
        }这样输出顺序就是MyClass3-MyClass2-MyClass1了。
      

  6.   

    本帖最后由 caozhy 于 2013-09-06 16:09:59 编辑
      

  7.   

    本帖最后由 caozhy 于 2013-09-06 16:12:17 编辑
      

  8.   

    贴一个正确的做法用到了工厂(Simple Factory)和非虚拟接口(NVI)模式using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;namespace ConsoleApplication1
    {
        class A
        {
            protected A()
            { 
            
            }        protected virtual void OnInit()
            {
                Console.WriteLine("A.Init()");
            }        public static A CreateInstance()
            {
                A a = new A();
                a.OnInit();
                return a;
            }
        }    class B : A
        {
            protected B()
            { 
            
            }        protected override void OnInit()
            {
                Console.WriteLine("B.Init()");
                base.OnInit();
            }        public static new B CreateInstance()
            {
                B b = new B();
                b.OnInit();
                return b;
            }
        }    class C : B
        {
            protected C()
            {        }        protected override void OnInit()
            {
                Console.WriteLine("C.Init()");
                base.OnInit();
            }        public static new C CreateInstance()
            {
                C c = new C();
                c.OnInit();
                return c;
            }
        }    class Program
        {
            static void Main(string[] args)
            {
                C c = C.CreateInstance();
            }
        }
    }C.Init()
    B.Init()
    A.Init()
    Press any key to continue . . .