OOP - 如何在类构造函数之前调用函数

时间:2012-06-16 20:18:07

标签: c# java oop

我明天有面试,我正在尝试回答这个问题:

此类中有一个名为C和方法m的类,此类也有空构造函数:

Main ()
{
C c = new c();

}

Class C {

public c {

//empty constructor

}

public m {

//does something - doesnt mind

}

} 

您需要做的是更改代码,以便在创建实例类C时,方法m将在类构造函数之前调用。

您必须在不更改main的情况下执行此操作(仅编辑类代码)。

提前致谢!

6 个答案:

答案 0 :(得分:2)

要在调用构造函数之前调用类的方法,您必须将此方法转换为 static ,这样您就不需要该类的实例来调用它,或者(在C#中)可以使用FormatterServices.GetUninitializedObject Method来获取类的实例,而无需运行构造函数(这当然可能不是明智之举)。

答案 1 :(得分:2)

与其他答案一样,您可以将方法设为静态。但是你需要明确地调用它。如果你创建了一个静态类构造函数,那么第一次引用类时就会自动调用(你不需要调用它)(比如构造第一个实例时)。您无法精确控制何时执行,但它将在构造第一个实例之前执行。根据他们提出问题的方式(你不能改变Main方法),我认为静态类构造函数是他们正在寻找的答案。

http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=vs.80%29.aspx

  

静态构造函数具有以下属性:       静态构造函数不接受访问修饰符或具有参数。       在创建第一个实例或任何静态成员之前,会自动调用静态构造函数来初始化类   引用。       无法直接调用静态构造函数。       用户无法控制程序中何时执行静态构造函数。

Java没有静态类构造函数,但它们确实有静态初始化块..

static {
    // code in here
}

答案 2 :(得分:2)

在Java和C#中,您可以使用,基类构造函数,静态构造函数(Java中的编辑:静态初始化程序块)和字段初始化程序,以便在C类的构造函数执行之前调用代码修改Main

在Java中使用字段初始化程序块的示例:

class C {

    { m(); }

    public C() {
        System.out.println("cons");
    }

    public void m() {
        System.out.println("m");
    }
}

这打印" m"然后" cons"。请注意,每次构造m时都会调用C。静态初始化程序块只能为JVM调用一次。

答案 3 :(得分:2)

在JAVA中: make方法static并在static块中调用您的方法。

class C{

static{
    m();
}

public C() {
    System.out.println("Constructor Called..");
}

public static void m() {
    System.out.println("m() is called.");

}
}

主要电话

public static void main(String[] args) {
    new C();
}

答案 4 :(得分:1)

它的基本OOP。您必须创建一个公共静态方法并调用它。然后该方法可以调用构造函数,也可以直接从main调用构造函数。

在调用构造函数之前,该对象不存在,因此不存在实例方法,因此无法调用与实例/对象无关的任何内容。调用构造函数之前唯一存在的就是静态方法。

答案 5 :(得分:1)

以下方式似乎达到了要求。不使用静态方法/变量

namespace FnCallBeforeConstructor
{
    static void Main(string[] args)
    {
        MyClass s = new MyClass();

        Console.ReadKey();
    }

    partial class  MyClass: Master
    {
        public override void Func()
        {
            Console.WriteLine("I am a function");
        }

        public MyClass()
            : base()
        {
            Console.WriteLine("I am a constructor");
        }
    }

    class Master
    {
        public virtual void Func() { Console.WriteLine("Not called"); }

        public Master()
        {
            Func();
        }
    }
}

输出是:

我是一名职能

我是构造函数