1

我明天有一个工作面试,我试图回答这个问题:

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

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

}

Class C {

public c {

//empty constructor

}

public m {

//does something - doesnt mind

}

} 

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

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

提前致谢!

4

6 回答 6

2

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

于 2012-06-16T20:24:40.803 回答
2

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

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

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

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

static {
    // code in here
}
于 2012-06-16T20:28:18.353 回答
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构造 a 时都会调用它。JVM 只会调用一次静态初始化程序块。

于 2012-06-16T20:38:06.627 回答
2

在 JAVA 中: 制作方法并在块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();
}
于 2012-06-16T20:46:48.843 回答
1

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

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

于 2012-06-16T20:25:08.180 回答
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();
        }
    }
}

输出是:

我是一个函数

我是构造函数

于 2015-08-10T18:25:57.113 回答