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

本文关键字:调用 函数 构造函数 OOP | 更新日期: 2023-09-27 18:37:22

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

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

Main ()
{
C c = new c();
}
Class C {
public c {
//empty constructor
}
public m {
//does something - doesnt mind
}
} 

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

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

提前感谢!

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

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

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

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

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

static {
    // code in here
}

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

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

C# 中,您可以使用基类构造函数、静态构造函数(编辑:Java 中的静态初始值设定项块)和字段初始值设定项,在 C 类的构造函数执行之前调用代码而不修改Main

在 Java 中使用字段初始值设定项块的示例:

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

这将打印"m",然后打印"cons"。请注意,每次构造C时都会调用 m。静态初始值设定项块只会为 JVM 调用一次。

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

在调用构造函数之前,对象不存在,因此

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

遵循方式似乎可以实现所需的内容。不使用静态方法/变量

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

输出为:

我是一个函数

我是构造函数