继承 - 需要指导

时间:2016-05-30 13:15:37

标签: c# class inheritance unity3d constructor

我是一名新手程序员,很抱歉,如果这是一个非常愚蠢的问题。我需要将值从一个类传递给另一个类。如果我没有弄错,这将通过继承来完成,但似乎有一些我遗漏的东西。欢迎任何帮助。我在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&#39 ;.轻松修复:让一切都变得静止(我相信我需要制作构造函数或类似的东西,以避免一直使用静态。对它的一点帮助会很棒!)。一旦没有错误,我运行程序,控制台输出0为我的配置文件耐力。对于发生的事情我真的很困惑。对不起,这是一篇很长的帖子,感谢我的帮助。

2 个答案:

答案 0 :(得分:1)

  

我需要将值从一个类传递到另一个类。如果我不是   错了,这可以通过继承来完成。

不,您不需要继承将值从一个类传递到另一个类。如果您不知道继承是什么,则不应使用它。你很可能不需要它。同样的事情适用于static关键字。新程序员在不知道static关键字的用途时,往往会制作所有内容new

只需在Stats构造函数脚本中创建Profile脚本的新实例即可。要使用Profile脚本,请创建一个新的实例,它将自动调用将创建Stats脚本的新实例的构造函数。您不应该使用静态变量和函数执行此操作。完全没必要。可以使用auto属性或函数将值传递给另一个脚本,但我的解决方案使用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

答案 1 :(得分: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。这可以通过将设置为静态来轻松显示。