【问题标题】:Use of Constructors - Odd Doubt构造函数的使用——奇怪的疑问
【发布时间】:2023-03-22 13:04:01
【问题描述】:

我正在阅读关于构造函数的文章,

当为一个类实例化一个对象时,c'tors(如果显式编写或默认的)是执行的起点。我的疑惑是

  • 更像是main() in C
  • 是的,我明白你的意思 可以使用设置所有默认值 c'tor.我也可以模仿行为 通过编写自定义方法。那为什么要批评?

例子:

//The code below is written in C#.
public class Manipulate
    {
        public static int Main(string[] args) {
            Provide provide = new Provide();
            provide.Number(8);
            provide.Square();
            Console.ReadKey();
            return 0;
        }
    }   

 public class Provide {
        uint num;
        public void Number(uint number)
        {
            num = number;
        }
        public void Square()
        {
            num *= num;
            Console.WriteLine("{0}", num);
        }
    }

我正在学习独立编程,所以我依赖于编程社区,你能不能给我推荐一个好的 OOP 资源来更好地理解。如果跑题了,请见谅。

【问题讨论】:

  • 这只是一个快捷方式,因此您无需编写 5 行无非是 setter 的额外代码。

标签: oop constructor


【解决方案1】:

您不能在自定义方法中模拟构造函数,因为在创建对象时不会调用自定义方法。仅调用构造函数。好吧,当然您可以在创建对象后调用您的自定义方法,但这不是惯例,使用您的对象的其他人不会知道这样做。

构造函数只是一种约定,在创建对象后作为设置对象的一种方式达成一致。

【讨论】:

    【解决方案2】:

    子对象将在构造函数中初始化。在像 C++ 这样的语言中,子对象存在于包含对象中(而不是作为通过指针或句柄连接的单独对象),构造函数是您将参数传递给子对象构造函数的唯一机会。即使在 Java 和 C# 中,任何基类都是直接包含的,因此其构造函数的参数必须由您的构造函数提供。

    最后,任何常量(或在 C# 中,readonly)成员变量只能从构造函数中设置。即使是从构造函数调用的辅助函数也无法更改它们。

    【讨论】:

      【解决方案3】:

      您也不能在不使用构造函数的情况下强制传递变量。如果你只想实例化一个对象,如果你说一个 int 传递给它,你可以将默认构造函数设置为私有,并让你的构造函数接受一个 int。这样,如果不使用 int,就不可能创建该类的对象。

      【讨论】:

        【解决方案4】:

        我们需要构造函数的原因之一是“封装”,代码做一些初始化必须不可见的事情

        【讨论】:

          【解决方案5】:

          我认为一个很好的学习方法是比较语言之间的 OOP,就像从不同的角度看同一张图片。

          谷歌搜索一下:

          为什么是构造函数? 简单函数(内部也可以有函数)和对象之间的主要区别在于,对象可以托管在“变量”中的方式,它的所有功能都在其中,并且也可以与另一个完全不同的反应“变量”里面有同一种“对象”。使它们具有相同结构并具有不同行为的方法取决于您为班级提供的论点。 所以这是一个懒惰的例子:

          car() 现在是一个类。

          c1 = 汽车()

          c2 = 汽车()

          ¿c1 正好是 c2?是的。

          c1 = 汽车(大众)

          c2 = 汽车(兰博基尼)

          C1 具有与 C2 相同的功能,但它们是完全不同的 car() 变量 volkswagen 和 Lamborghini 直接传递给构造函数。 为什么是-constructor-?为什么没有其他功能?答案是:顺序。

          这是我最好的机会,伙计,这么晚了。我希望我能以某种方式提供帮助。

          【讨论】:

            【解决方案6】:

            首先,大多数答案至少在一定程度上取决于您使用的语言。在一种语言中很有意义的原因在其他语言中不一定有直接的类似物。例如,在 C++ 中,有很多情况会自动创建临时对象。 ctor 作为该进程的一部分被调用,但对于大多数实际目的,不可能显式调用进程中的其他成员函数。不过,这不一定适用于其他 OO 语言——有些根本不会隐式创建临时对象。

            【讨论】:

              【解决方案7】:

              可以使用常规方法模拟构造函数和析构函数功能。然而,这两种方法的独特之处在于语言以一种特殊的方式对待它们。

              在创建或销毁对象时自动调用它们。这提供了一种统一的方法来处理在对象生命周期的这两个关键时期必须发生的最微妙的操作。它消除了类的最终用户忘记在适当的时间调用它们的可能性。

              此外,继承等高级 OO 特性需要这种一致性才能发挥作用。

              【讨论】:

                【解决方案8】:

                通常,您应该在构造函数中进行所有初始化。构造函数是创建类的实例时首先调用的东西,因此您应该在此处设置任何默认值。

                【讨论】:

                  【解决方案9】:

                  Head First OOA&D 将是一个良好的开端。

                  你不觉得调用一个函数来设置你的类的每个成员变量有点开销吗。

                  使用构造函数,您可以一次性初始化所有成员变量。这个理由还不足以让你拥有构造函数吗?

                  【讨论】:

                  • 我的重点是除了初始化成员变量之外,您还有什么其他用途。还是更像是,而不是使用构造函数进行初始化,而不是使用单独的方法声明?
                  • 这就是 OOP 的全部内容!
                  猜你喜欢
                  • 2013-05-10
                  • 1970-01-01
                  • 2015-10-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多