簡體   English   中英

如何知道在創建對象時使用了哪個構造函數?

[英]how to know which constructor was used in creating an object?

考慮

Class A has two constructors new A(int), new A(int, String)

it has a method show()

然后給出一個聲明,

A a1= new A(4);
A a2= new A(3, "foo");

然后在代碼中(或在傳遞這些對象的一些方法中)

a1.show();
a2.show();
new A(3).show();
and 
new A(2,"bar").show();

如果我想區分基於對象(a1和a2)的這些show方法以及基於類實例表達式(直接在構造函數上調用show)並且不知道使用了哪個構造函數(特別是對象a1和a2)我怎么發現 - 反思說?

執行此操作的唯一方法是讓每個構造函數設置一個不同的變量來指示它已被使用。

但我同意湯姆的意見; 這聽起來像個壞主意。 無論你如何創建一個對象(因為一個構造函數甚至根本就沒有被使用過,比如說,在序列化中),它應該只關系到所有它的屬性(公共或非公共)都被恰當地設置,以反映狀態它需要在。

也許A應該是兩個不同的類(每個類都有不同的構造函數); 或者公共基類的兩個不同的子類:以這種方式,每個類可以擁有它自己的show方法的獨特實現。

或者,在A中有一個數據成員(可能是布爾值或字符串),其值由每個構造函數設置。

同意你最好使用兩個單獨的類,在這種情況下你可以使用多態(C#中的例子),

public class Base
{
    public BaseClass()
    public virtual void Show
    {
        // show stuff
    }
}

public class A : Base
{
    public A(int i)
    public override void Show()
    {
        // show A stuff
    }
}

public class B : Base
{
    public B(int i, String s)
    public override void Show()
    {
        // show B stuff
    }
}

然后打電話給班級

Base a1= new A(4);
Base a2= new B(3, "foo");

並且應該很容易區分基於a1和a2對象的這些show方法。

如果兩個類具有不同的行為集,則它們是兩個不同的類。 單個類的行為不應該根據它的構造方式而有所不同。

無法通過反射確定使用哪個構造函數來實例化對象。 為什么不簡單地在每個構造函數中將實例變量設置為不同的值來跟蹤哪個被調用?

因此,調用show的所有四種方式應該執行不同的操作嗎?

為什么以及每個動作之間有什么區別?

不知道更多,我們只能做出瘋狂的猜測。 它聽起來像兩個甚至四個類(加上一個基類/接口)和一個工廠來創建它們。

如果問題純粹是理論上的 - 不,你不能在運行時告訴我們之間的區別:

A a = new A();
a.show();

new A().show();

唯一的方法是檢查源¹,因此您必須包含源代碼並使用包含的完整源代碼進行編譯。 解析源代碼以解決它的調用方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM