2012-06-16 129 views
1

我有一个面试前的明天,我试图回答这样一个问题:OOP - 如何调用一个函数类的构造函数

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

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

} 

Class C { 

public c { 

//empty constructor 

} 

public m { 

//does something - doesnt mind 

} 

} 

而你所要做的就是改变代码,以便在创建一个实例类C的,该方法m将在类的构造函数之前被调用。

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

在此先感谢!

+9

C#和Java是不同的语言... –

+9

什么愚蠢的面试问题。 – vcsjones

+1

你的代码不能编译。 – meriton

回答

2

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

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

Static constructors have the following properties: A static constructor does not take access modifiers or have parameters. A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced. A static constructor cannot be called directly. The user has no control on when the static constructor is executed in the program.

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

static { 
    // code in here 
} 
+0

感谢您的回答。使马静态方法的问题是: 我不能改变主,所以我不能改变构造函数的m(),我只能 在构造函数中调用m()但m()不会在构造函数.. (所以我仍然不明白的是如何在构造函数之前调用m(),即使m()是一个静态函数 - 因为我不能改变main()) – thechmodmaster

+0

@thechmodmaster如果你让ma静态类的构造函数,那么它会在您调用构造函数创建新实例之前自动执行。 – hatchet

+0

我明白了。所以我需要将m()更改为静态类构造函数,而不是静态函数。 – thechmodmaster

2

要调用类的方法,它的构造函数被调用你之前要么必须把这种方法引入静态所以你不需要这个类的一个实例来调用它,或者(在C#),你可以使用FormatterServices.GetUninitializedObject Method来无需运行构造函数就可以获得类的实例(这当然不是明智的做法)。

+3

好戏,但请考虑团队中的维护问题。这不是标准的面向对象操作,它对普通程序员来说很难理解。寻找调用构造函数的团队成员会浪费大量时间。不要这样做。 – Atif

+0

是的,你说得对。但我并不建议任何人这样做,甚至MSDN也声明*“当用户打算立即填充所有字段时,只能将当前方法用于反序列化”。我只是为了好奇而将它放在我的答案中:)。 –

1

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

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

2

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

在Java中使用的字段初始化代码块的一个例子:

class C { 

    { m(); } 

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

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

此打印的 “m”,然后 “缺点”。请注意,每构建一个C,就会调用m。 JVM只能调用一次静态初始化块。

+0

你能证明吗? – thechmodmaster

+0

@thechmodmaster请参阅编辑。 –

+0

@mikez我无法编译此代码。你确定这有效吗? – hage

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(); 
} 
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(); 
     } 
    } 
} 

输出是:

我是一个功能

我是一个构造函数

相关问题