2016-05-30 88 views
0

我是一個新手程序員,非常抱歉,如果這是一個非常愚蠢的問題。我需要將一個類的值傳遞給另一個類。如果我沒有弄錯,這將通過繼承來完成,但似乎有一些我錯過了。任何幫助將受到歡迎。我正在Unity中編寫C#。繼承 - 需要指導

public class baseStats{ 
    private int STAMINA; 

    public static int Stamina{ 
     get{return STAMINA;} 
     set{STAMINA = value;} 
    } 
} 

以上是我的父類的示例。這裏是我的子類:

public class Profile : baseStats { 

    private static int PROFILE_STAMINA; 

    private void Stats() 
    { 
    PROFILE_STAMINA = Stamina; 

    } 

    public static int profileStamina 
    { 
    get{return PROFILE_STAMINA;} 
    } 

} 

在我調試的目的,創造了第三個腳本,我寫道:

public class debug:MonoBehaviour{ 
     void Start(){ 
      Debug.Log(Profile.profileStamina.ToString()); 
    } 
} 

它說我需要非靜態字段,方法的對象引用,或屬性 'Profile.Profile.Stamina'。簡單的解決方法:讓所有的東西都是靜態的(我相信我需要製作構造函數或類似的東西,以避免不得不一直使用靜態,有一點幫助會很棒!)。一旦沒有錯誤,我運行程序,控制檯爲我的個人資料耐力輸出0。至於發生了什麼,我感到非常困惑。對不起,這是一個很長的帖子,並感謝我得到的任何幫助。

+1

第三個腳本中的'profileStamina'如何定義?請更新您的代碼。只需提供完整的第三個腳本,就像你爲別人做的一樣。 – Programmer

+0

這是完整的腳本。 http://imgur.com/tasBn6r –

+0

你在圖片中有'Profile.profileStamina'。爲什麼不更新你的問題。只需將您的代碼直接從您的IDE複製到SO就可以避免不必要的問題。另外,您的'Profile'腳本不包含在問題中。我不知道沒有這些,人們可以如何提供幫助。請確保此處的其他代碼與您IDE中的代碼相同。 – Programmer

回答

1

我需要將一個類的值傳遞給另一個類。如果我不是 錯誤,這將通過繼承來完成。

不,您不需要繼承來將值從一個類傳遞到另一個類。如果你不知道繼承是什麼,你就不應該使用它。很可能你不需要它。同樣的事情適用於static關鍵字。當新程序員不知道new關鍵字用於什麼時,傾向於將所有內容都製作成static

只需在Profile構造函數腳本中創建一個Stats腳本的新實例。要使用Profile腳本,請創建一個新實例,該實例將自動調用將創建Stats腳本的新實例的構造函數。你不應該用靜態變量和函數來做這件事。完全沒有必要。值可以通過自動屬性或函數傳遞給另一個腳本,但是我的解決方案使用auto屬性來簡化它。

public class Stats 
{ 
    private int STAMINA; 

    public int Stamina 
    { 
     get { return STAMINA; } 
     set { STAMINA = value; } 
    } 
} 

public class Profile 
{ 
    private Stats stats; 
    private int PROFILE_STAMINA; 

    //Init only 
    public Profile() 
    { 
     stats = new Stats(); 
    } 

    //Init with Stats stamina and profileStamina stamina values 
    public Profile(int stamina, int profileStamina) 
    { 
     stats = new Stats(); 
     stats.Stamina = stamina; 
     PROFILE_STAMINA = profileStamina; 
    } 

    //Stamina From Profile 
    public int profileStamina 
    { 
     get { return PROFILE_STAMINA; } 
     set { PROFILE_STAMINA = value; } 
    } 

    //Stamina From Stats 
    public int Stamina 
    { 
     get { return stats.Stamina; } 
     set { stats.Stamina = value; } 
    } 
} 

用法:

public class debug:MonoBehaviour{ 
Profile profile = null; 

void Start() 
{ 

    //Creata new profile and set Stats stamina and ProfileStamina stamina values 
    profile = new Profile(10, 5); 
    profile.Stamina = 60; 
    profile.profileStamina = 60; 
    Debug.Log(profile.profileStamina.ToString()); 
} 

還需要一段時間,瞭解ClassesProperties

+0

感謝您花時間撰寫富有洞察力的回覆。這非常有幫助。 –

+0

@TimothyWhite歡迎您。不要忘記訪問我發佈的鏈接。你需要了解創建類的實例。快樂的編碼! – Programmer

0

您試圖從靜態屬性訪問非靜態。

此代碼的主要問題是:

public static int Stamina{ 
    get{return STAMINA;} 
    set{STAMINA = value;} 
} 

STAMINA被定義爲private int STAMINA。它不是靜態的。很簡單,這意味着在類型爲baseStats的每個對象內部都有一個可以填寫的稱爲STAMINA的int。但是,您不是,而是在那裏有一個對象;你在一個靜態函數中,這是一個可以執行的東西而不是的一個對象。由於沒有對象,所以不存在STAMINA int;沒有任何對象可以在上獲得或填寫該屬性

在該說明中,您的功能profileStats()具有相同的問題;它也嘗試訪問非靜態的STAMINA,同樣沒有任何類型的對象。任何提到的只是普通的STAMINA實際上是this.STAMINA,而在靜態裏面,沒有this

我不確定這整個設置的目的是什麼;我個人會避免使用包含像這樣的全局數據的靜態。相反,我只是保留一個包含必要屬性的對象,只需傳遞給需要訪問其中數據的任何函數。但無論如何,從我所看到的情況來看,你只是忘了把static放在private int STAMINA上。

附註:這與遺傳完全無關。由於Stamina是一個公共靜態屬性,並且靜態屬性不能被繼承(除了一些特有的帶有繼承泛型的高級情況),所以「子類」甚至不需要父類作爲父類,只要它引用baseStats.Stamina而不是STAMINA 。這可以通過使兩個靜態顯示。

+0

非常感謝您的幫助。我會根據你的指示修改我的代碼。 –