【问题标题】:How to use 2 Constructors?如何使用 2 构造函数?
【发布时间】:2012-12-13 14:41:58
【问题描述】:

我有以下课程:

public class STElement
{
  public int _value;
  public STElement _next;
  public int _index;

  public STElement()
  {
    _value = 0;
    _next = null;
    _index = 0;
  }
}

在程序的运行时我想创建一些像这样的对象:

_rootStack1 = new STElement();
_rootStack2 = new STElement();
_rootStack3 = new STElement();

但我只希望 _rootStack1 具有 _index = 0;

那么我该怎么做,三个对象中只有一个获得_index?

【问题讨论】:

  • 不确定我是否跟随,你的意思是每个连续的_rootStack# 都会有一个递增的索引吗?那么_rootStack1._index == 0_rootStack2._index == 1_rootStack3._index == 2?
  • So how can I do it, that only one of the three objects get _index? 你想让其他人没有_index吗?
  • 你不能确保你只会拥有一个带有_index == 0的对象。
  • 或者您可能希望其他实例根本没有索引字段?然后创建一个没有该字段的基类,并在添加该字段的类中派生它。这样你就会有 _rootStack1 = new STElementWithIndex();其余的将是基类的实例。这就是你想要的吗?
  • @TimKatheteStadler 我认为反对票是因为您的问题太模棱两可/令人困惑。我仍然不确定你在问什么。根据定义,您的类已将所有实例分配给它们 some _index 值;你所说的只是其他两个实例“不应该得到它们”,这没有意义(尤其是当它们都默认分配0时)。我们试图澄清你的思维过程是什么以及你真正想要什么。或许您应该描述一下您要完成的最终任务?

标签: c# class constructor


【解决方案1】:

您可以创建一个构造函数,它获取索引的值并将其分配给变量。

public STElement(int index)
{
  _value = 0;
  _next = null;
  _index = index;
}

这不会强制该对象是唯一具有此类 0 索引的对象 - 这不是对象可以直接执行的操作。

注意风格 - 拥有public 字段不是一个好习惯。您应该使用属性来公开它们。

【讨论】:

    【解决方案2】:
    public class STElement
    {
      public int _value;
      public STElement _next;
      public int _index;
    
      public STElement()
      {
        _value = 0;
        _next = null;
        _index = 0;
      }
      public STElement(int index)
          : this()
      {
         _index = index;
      }
    }
    
    
    _rootStack1 = new STElement(1);
    _rootStack2 = new STElement(2);
    _rootStack3 = new STElement();
    

    【讨论】:

      【解决方案3】:

      STElement st1 = 新 STElement(1);

      public class STElement
      {
        public int _value;
        public STElement _next;
        public int _index;
      
        public STElement()
        {
          _value = 0;
          _next = null;
          _index = 0;
        }
        public STElement(int index)
        {
          _value = 0;
          _next = null;
          _index = index;
        }
      }
      

      【讨论】:

        【解决方案4】:

        为什么不将所需的索引传递给构造函数?

        您可以使用默认参数创建一个构造函数,而不必像这样更改对其进行的其他调用:

        public STElement(int index = 0)
        {
          _value = 0;
          _next = null;
          _index = index;
        }
        

        这样,所有未传递索引的实例都将获得默认值,而对于其他实例,您可以指定所需的某个索引。或者你可以反过来做,将默认值设置为不同于 0 的值,并且只针对你想要的,你可以调用 index = 0 的构造函数。

        【讨论】:

          【解决方案5】:

          你可以像方法一样重载构造函数。 类似这样:

           public STElement()
            {
              _value = 0;
              _next = null;
              _index = 0;
            }
          
           public STElement(int param1)
            {
              _value = param1;
              _next = null;
              _index = 0;
            }
          
           public STElement(int param1, int param2):this()
            {
              _value = param1;
              _next = null;
              _index = param2;
            }
          

          ...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-20
            • 1970-01-01
            • 2015-02-03
            • 2012-10-26
            • 1970-01-01
            • 2018-03-27
            相关资源
            最近更新 更多