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
的情况下执行此操作(仅编辑类代码)。
提前感谢!
就像其他答案所说的那样,你可以使该方法成为静态的。但是你需要显式调用它。如果你创建了一个静态类构造函数,它将被自动调用一次(你不需要调用它),第一次引用该类时(比如当你构造第一个实例时)。您无法完全控制它何时执行,但它将在构造第一个实例之前执行。根据他们措辞问题的方式(您无法更改 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();
}
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();
}
}
}
输出为:
我是一个函数
我是构造函数