问题标签 [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 回答
34982 浏览

design-patterns - 数据验证设计模式

如果我有一组数据库表(例如,在 Access 文件中),并且需要根据一个规则集验证该集合中的每个表,该规则集具有跨所有表的通用规则以及特定于一个或一个子集的单个规则表,有人可以推荐一个好的设计模式来研究吗?

具体来说,我想避免类似的代码:

另外,我决定使用 log4net 来记录所有的错误和警告,这样每个方法都可以被声明void并且不需要返回任何东西。这是一个好主意,还是创建某种ValidationException捕获所有异常并将它们存储在 a 中List<ValidationException>,然后在最后将它们全部打印出来会更好?

我确实找到了这个,看起来它可能有效,但我希望能找到一些代码示例来解决。有什么建议么?过去有没有人做过类似的事情?

对于某些背景,该程序将使用 C# 或 VB.NET 编写,并且表很可能存储在 Access 或 SQL Server CE 中。

0 投票
2 回答
9702 浏览

c# - 如何在 C# 中对泛型类型指定多个约束?

对多种类型施加约束的语法是什么?基本示例:

我想在以下定义中对这两种类型进行约束,以便SpeciesType必须继承自Species并且OrderType必须继承自Order

0 投票
17 回答
1180 浏览

c# - 为什么继承不能像我认为的那样工作?

我遇到了一些继承问题,因为我有一组相互关联的抽象类,需要一起重写以创建客户端实现。理想情况下,我想做以下事情:

这将允许任何使用 Dog 类的人自动获取 DogLegs 并允许任何使用 Animal 类的人获取 Legs。问题是被覆盖的函数必须与基类具有相同的类型,因此无法编译。我不明白为什么不应该这样做,因为 DogLeg 可以隐式转换为 Leg。我知道有很多方法可以解决这个问题,但我更好奇为什么这不可能/在 C# 中实现。

编辑:我对此进行了一些修改,因为我实际上是在代码中使用属性而不是函数。

编辑:我把它改回函数,因为答案只适用于那种情况(属性的 set 函数的 value 参数的协方差不应该起作用)。波动请见谅!我意识到这让很多答案看起来无关紧要。

0 投票
7 回答
605 浏览

c# - 哪些语言支持继承方法的返回类型的协变?

我最初问了这个问题,但在找到答案时,发现我最初的问题是 C# 中缺乏对继承方法的返回类型的协方差的支持。发现这一点后,我对哪些语言支持此功能感到好奇。

我会接受谁能说出最多名字的答案。

编辑:John Millikin 正确地指出许多动态语言都支持这一点。澄清:

我只是在寻找静态/强类型语言。

0 投票
10 回答
6032 浏览

php - 在 PHP 中使用动态变量实例化对象的含义

使用以下形式在 PHP 中声明新类实例的性能、安全性或“其他”含义是什么

这是一个人为的例子,但我已经看到在工厂 (OOP) 中使用这种形式来避免使用大的 if/switch 语句。

立即想到的问题是

  1. 你失去了将参数传递给构造函数的能力(谎言。谢谢杰里米)
  2. 闻起来像 eval(),它带来了所有的安全问题(但不一定是性能问题?)

还有什么其他含义,或者有人可以使用“Rank PHP Hackery”以外的搜索引擎术语来研究这个?

0 投票
3 回答
12222 浏览

php - 类似于 php 中的回调委托函数

我想在 PHP 中实现类似于 ac# 委托方法的东西。一个简短的词来解释我总体上要做什么:我正在尝试实现一些异步功能。基本上,当底层系统处理它时,一些资源密集型调用会被排队、缓存和分派。当异步调用最终收到响应时,我希望引发回调事件。

我在提出一种在 PHP 中进行回调的机制时遇到了一些问题。我想出了一个现在可行的方法,但我对它不满意。基本上,它涉及传递对对象的引用以及将用作回调的方法的名称(将响应作为参数),然后在需要时使用 eval 调用方法。由于各种原因,这是次优的,有没有人知道的更好的方法?

0 投票
32 回答
396723 浏览

language-agnostic - 更喜欢组合而不是继承?

为什么更喜欢组合而不是继承?每种方法都有哪些取舍?什么时候应该选择继承而不是组合?

0 投票
14 回答
3006 浏览

oop - 为什么声称 C# 的人没有获得面向对象的编程?(相对于面向类)

昨晚引起了我的注意。

在最新的ALT.NET 播客中,Scott Bellware 讨论了与 Ruby 相比,c#、java 等语言如何。并不是真正的面向对象,而是选择“面向类”这个短语。他们用非常模糊的术语谈论这种区别,而没有深入细节或讨论利弊。

这里的真正区别是什么?它有多大关系?那么还有哪些其他语言是“面向对象的”?这听起来很有趣,但我不想学习 Ruby 只是为了知道我缺少什么。

更新:阅读下面的一些答案后,似乎人们普遍同意该参考是鸭式打字。我不确定我是否仍然理解的是,这最终会改变一切的说法。特别是如果你已经在做适当的 tdd 松耦合等等等等。有人可以向我展示一个我可以用 ruby​​ 做的奇妙事情的例子,而我不能用 c# 做这件事,并举例说明了这种不同的 oop 方法吗?

0 投票
2 回答
1656 浏览

php - 对于只需要一个连接的应用程序,在 PHP5 中隐藏数据库连接代码的最佳方法是什么?

下面我介绍了三个选项,用于在仅涉及单个连接时简化我的数据库访问(这通常是我工作的 Web 应用程序的情况)。

一般的想法是使数据库连接透明,以便它在我的脚本第一次执行查询时连接,然后保持连接直到脚本终止。

我想知道你认为哪一个是最好的,为什么。我不知道这些可能适合的任何设计模式的名称,很抱歉没有使用它们。如果使用 PHP5有更好的方法,请分享。

简单介绍一下:有一个包含查询方法的DB_Connection 类。这是一个不受我控制的第三方类,为了本示例的目的,我已经简化了它的接口。在每个选项中,我还为虚构的数据库“项目”表提供了一个示例模型,以提供一些上下文。

选项 3 是为我提供了我最喜欢的界面的选项,但不幸的是我认为它不实用。

我已经在下面的评论块中描述了每种方法的优缺点(我可以看到)。

目前我倾向于选项 1,因为负担放在了我的数据库包装类而不是模型上。

所有评论表示赞赏!

注意:出于某种原因,堆栈溢出预览显示的是编码的 HTML 实体,而不是下划线。如果帖子是这样通过的,请考虑到这一点。

0 投票
7 回答
4659 浏览

delphi - 如果没有显式调用,Delphi 调用是否继承于被覆盖的过程

如果代码中没有显式调用(继承;),Delphi 调用是否继承于被覆盖的过程,我有以下结构(从超类到子类)

TForm >> TBaseForm >> TAnyOtherForm

项目中的所有表单都将派生自 TBaseForm,因为这将具有用于每个表单(安全性、验证等)的所有标准设置和破坏性部分。

TBaseForm 有 onCreate 和 onDestroy 程序以及执行此操作的代码,但是如果有人(即我)忘记将继承添加到 TAnyOtherForm 上的 onCreate 中,Delphi 会为我调用它吗?我在网上找到了说它不是必需的参考资料,但没有地方说如果代码中省略它是否会被调用。

另外,如果它确实为我调用了继承,它什么时候会调用它?