2013-01-17 25 views
0

當前讓我們假設有這些類:C#如何獲取類的實例相當於自PHP

class A { 
    public string attr = "Class A"; 

    public static void getAttribute(){ 
     self currentClass = new self(); // equivalent to php 
     Console.Write("Attribute : " + currentClass.attr); 
    } 
} 

Class B : A { 
    public string attr = "Class B"; 
} 

B = new B(); 
B.getAttribute(); 

我想B.getAttribute();打印Attribute: Class B。我怎樣才能做到這一點?

+0

.Net成員名稱應該是UpperCamelCase。 – SLaks

回答

1

我可能知道你在做什麼,但我必須告訴你,這種PHP方法在C#中沒有任何意義。我勸你不要使用它。

public class A 
{ 
    private String attr = "Class A"; 

    public static String getAttribute() 
    { 
     return (new A()).attr; 
    } 
} 

public class B : A 
{ 
    private String attr = "Class B"; 

    public static String getAttribute() 
    { 
     return (new B()).attr; 
    } 
} 
+0

但我怎樣才能獲得當前類的實例? –

+0

海報的getAttribute()方法是靜態的,這是行不通的。靜態成員不能被覆蓋。 –

+0

這也是來自PHP的代碼。 –

2

這是根本不可能的。

B.getAttribute()編譯爲A.getAttribute()

+0

是任何方式來解決這個我知道在PHP的答案我只想當前類的願望 –

+0

@AntonioPapa:不,你應該重新考慮你的設計;靜態方法不應該與派生類交互。 – SLaks

+0

好的,但如果它不是靜態的,我該怎麼辦? –

0

如果你問如何做類似的東西在C#中,我想答案應該是沿着這些路線:

public class A 
{ 
    public virtual string attr 
    {  
     get { return "Class A" } 
    } 

    public void getAttribute(){ 
     Console.Write("Attribute : " + attr); 
    } 
} 

public class B : A 
{ 
    public override string attr 
    {  
     get { return "Class B"; } 
    } 
} 

var b = new B(); 

b.getAttribute(); 

關於我在其他答案的評論,如果你需要的getAttribute是靜態的,你可以實現這樣說:

public static void getAttribute(A obj){ 
    Console.Write("Attribute : " + obj.attr); 
} 

你可以這樣稱呼它:

var b = new B(); 
A.getAttribute(b); 
+0

好的謝謝,但我怎樣才能得到當前類的實例?像currentClass.attr =「一些文本」 –

+0

@AntonioPapa我想你可能想看看'this'關鍵字http://msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80)。 aspx –

+0

@AntonioPapa你只要做字符串val = this.attr;實際上,這是多餘的,通常只是爲了清晰起見。如果你在類的實例方法中,你可以簡單地像變量一樣使用attr。 – Pete

0

您通過'this'關鍵字獲取當前類實例。顯然你不能在靜態方法中訪問它,因爲根據定義,靜態方法在沒有特定實例的情況下執行。

另一方面,要從同一個類中訪問成員變量/屬性/方法,根本不需要'this'關鍵字,因爲它是隱式的。