2012-06-16 169 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(); 
     } 
    } 
} 

輸出是:

我是一個功能

我是一個構造函數

相關問題