2016-05-30 87 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

非常感谢您的帮助。我会根据你的指示修改我的代码。 –