问题标签 [oop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
919 浏览

c++ - C++ - “堆栈自动”是什么意思?

在我浏览互联网时,我遇到了这个帖子,其中包括这个

“(写得很好)C++ 竭尽全力使堆栈自动对象“像”原语一样工作,这反映在 Stroustrup 的“像整数一样做”的建议中。这需要更加遵守面向对象开发的原则:你的类是不正确的,直到它“像”一个 int 一样工作,遵循“三法则”,保证它可以(就像一个 int 一样)作为堆栈自动被创建、复制和正确销毁。

我已经编写了一些 C 和 C++ 代码,但只是顺便说一句,从来没有什么严重的事情,但我只是好奇,这到底是什么意思?

有人可以举个例子吗?

0 投票
3 回答
4700 浏览

c# - 继承需要存储子类特定数据的数组的最佳方法是什么?

我正在尝试设置类似于以下的继承层次结构:

我只想将 MotorcycleAxle 对象存储在 Motorcycle 对象的 Axles 数组中,并将 CarAxle 对象存储在 Car 对象的 Axles 数组中。问题是没有办法覆盖子类中的数组来强制其中一个。理想情况下,类似以下内容对 Motorcycle 类有效:

但是覆盖时类型必须匹配。我怎样才能支持这种架构?我是否只需要在访问 Axles 成员的任何地方进行大量运行时类型检查和转换?我不喜欢添加运行时类型检查,因为您开始失去强类型和多态性的好处。在这种情况下必须至少进行一些运行时检查,因为 WheelAttached 和 Left/RightWheelAttached 属性取决于类型,但我想最小化它们。

0 投票
3 回答
15826 浏览

java - 如何从 Java 中的匿名内部类中获取对封闭类的引用?

我目前正在外部类中创建对此的显式引用,以便在匿名内部类中引用一个名称。有一个更好的方法吗?

0 投票
13 回答
2909 浏览

c# - 具有相同参数类型的构造函数

我有一个带有两个构造函数的 Person 对象——一个接受一个 int (personId),另一个接受一个字符串 (logonName)。我想要另一个接受字符串(badgeNumber)的构造函数。我知道这是不可能的,但似乎这可能是一种常见的情况。有没有优雅的方法来处理这个?我想这将适用于任何重载的方法。代码:

...ETC。

0 投票
8 回答
47393 浏览

oop - 我在哪里使用代表?

现实世界中有哪些地方需要代表?我很好奇这种方法是最佳解决方案的情况或模式。无需代码。

0 投票
3 回答
1946 浏览

c++ - 有没有我们*需要*在 C++ 中受保护的继承的例子?

虽然我见过需要私有继承的罕见情况,但我从未遇到需要受保护继承的情况。有人有例子吗?

0 投票
8 回答
3695 浏览

php - 这是在 PHP 类中处理 getter/setter 的合理方法吗?

我将尝试使用此问题的格式进行一些尝试,并且我非常愿意接受有关更好的处理方法的建议。

我不想只是在问题中转储一堆代码,所以我已经在refactormycode.

用于轻松处理类属性的基类

我的想法是人们可以在此处发布代码片段,也可以对其进行更改refactormycode并将链接发布回他们的重构。我将根据此投票并接受答案(假设有一个明确的“赢家”)。

无论如何,到班级本身:

我看到很多关于 getter/setter 类方法的争论,是直接访问简单的属性变量更好,还是每个类都定义了明确的 get/set 方法,等等等等。我喜欢使用显式方法的想法,以防您以后必须添加更多逻辑。然后您不必修改任何使用该类的代码。但是我讨厌有一百万个看起来像这样的函数:

现在我确定我不是第一个这样做的人(我希望有人可以向我建议更好的方法)。

基本上,PropertyHandler 类有一个 __call 魔术方法。任何通过 __call 以“get”或“set”开头的方法都会被路由到将值设置或检索到关联数组中的函数。进入数组的键是获取或设置后调用方法的名称。因此,如果进入 __call 的方法是“getFirstName”,则数组键是“FirstName”。

我喜欢使用 __call 因为它会自动处理子类已经定义了“getFirstName”方法的情况。我的印象(我可能错了)是 __get 和 __set 魔术方法不这样做。

所以这里有一个例子说明它是如何工作的:

请注意,PropTest 实际上没有“setFirstName”或“getFirstName”方法,PropTest 也没有。所做的只是操作数组值。

另一种情况是您的子类已经在扩展其他内容。由于您在 PHP 中不能拥有真正的多重继承,因此您可以让您的子类将 PropertyHandler 实例作为私有变量。您必须再添加一个功能,但事情的行为方式完全相同。

请注意子类如何具有一个 __call 方法,该方法只是将所有内容传递给 PropertyHandler __call 方法。


反对以这种方式处理 getter 和 setter 的另一个很好的论点是它很难记录。

事实上,基本上不可能使用任何类型的文档生成工具,因为不存在不记录的显式方法。

我现在几乎已经放弃了这种方法。这是一个有趣的学习练习,但我认为它牺牲了太多的清晰度。

0 投票
2 回答
232 浏览

inheritance - 类设计决策

我有一个小难题,也许你可以帮我解决。

我今天一直在修改 ASP.NET 的 Membership 以添加一个间接级别。基本上,ASP.NET 的成员资格支持用户和角色,所有授权规则都基于用户是否属于角色。

我需要做的是添加功能的概念,其中用户将属于一个(或多个角色),并且该角色将具有与之关联的一个或多个功能,允许我们根据用户是否属于授权特定操作分配给已分配功能的角色。

话虽如此,我的问题与它无关,这是一个通用的类设计问题。

我想在我的基本 RoleProvider 类中提供一个抽象方法来创建函数(并将其持久化),但我想让它成为可选的以保存该函数的描述,所以我需要创建一个重载的 CreateFunction 方法签名接受名称,另一个接受名称和描述。

我可以想到以下场景:

  1. 使用 abstract 修饰符创建两个签名。这样做的问题是,实现者可能不尊重最佳实践,即一个重载应该调用另一个参数归一化的重载,并且逻辑应该只在最后一个(具有所有参数的那个)中。此外,要求开发人员实现这两种方法也不是很好。

  2. 创建第一个像虚拟的,第二个像抽象的。从第一个调用第二个,允许实现者覆盖行为。它有同样的问题,实施者在覆盖它时可能会做出“错误的决定”。

  3. 和以前一样,但不允许第一个被覆盖(删除虚拟修饰符)。这里的问题是实现者必须意识到可以使用空描述调用该方法并且必须处理这种情况。

我认为最好的选择是第三个...

一般如何处理这种情况?当您设计一个抽象类并且它包含重载方法时。我认为这并不少见……

0 投票
20 回答
354023 浏览

java - Java中的结构类对象

是否完全违反 Java 方法来创建类似对象的结构?

我可以看到一个带有访问器和修改器的类更像 Java。

第一个示例中的类在符号上很方便。

这不太方便。

0 投票
10 回答
69220 浏览

oop - 你应该使用受保护的成员变量吗?

你应该使用受保护的成员变量吗?这有什么优势以及会导致什么问题?