问题标签 [abstract-class]

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 投票
10 回答
8962 浏览

.net - 接口/抽象类中的静态方法

首先,我了解接口或抽象类(在 .NET/C# 术语中)不能具有抽象静态方法的原因。然后我的问题更集中在最佳设计解决方案上。

我想要的是一组“帮助器”类,它们都有自己的静态方法,这样如果我从第三方供应商那里获得对象 A、B 和 C,我可以拥有带有方法的帮助器类,例如

由于我的 AHelper、BHelper 和 CHelper 类基本上都具有相同的方法,因此将这些方法移动到这些类随后派生的接口似乎是有意义的。但是,希望这些方法是静态的,这使我无法拥有一个通用接口或抽象类来派生它们。

我总是可以使这些方法非静态,然后首先实例化对象,例如

但是,这段代码对我来说似乎并不直观。你有什么建议?我应该完全放弃使用接口或抽象类(我现在所处的情况)还是可以对其进行重构以完成我正在寻找的设计?

0 投票
6 回答
602 浏览

.net - .NET 抽象类

我正在设计一个网站导航层次结构。它是一棵节点树。

大多数节点都是页面。一些节点是链接(想想 Windows 中的快捷方式)。

大多数页面都包含 HTML 内容。一些执行代码。

我想将这些表示为这个类和抽象(MustInherit)类的集合......

类图

这是我要存储所有这些的数据库表……

数据库表 http://img178.imageshack.us/img178/8573/nodetablefm8.gif

这就是我难过的地方。PageNodes 可能是也可能不是根。

我应该如何处理根类?

类图

我不想拥有所有四个……

  • HtmlPageNode
  • 代码页节点
  • Html页面节点
  • 代码页面节点

我希望 HtmlPageNode 和 CodePageNode 类从 PageNode从 RootPageNode 继承。那可能吗?


澄清:有多个根节点,根可能有父节点。每个都是唯一具有不同样式的子树的根。想想不同的、颜色编码的部门。(也许 root 是一个糟糕的名称选择。建议?)


更新:关于“根”名称......
我问过:是否有对应于子树的节点的特定名称?

0 投票
16 回答
15346 浏览

c++ - 在 C++ 中使用接口的性能损失?

在 C++ 中使用接口(抽象基类)时是否存在运行时性能损失?

0 投票
4 回答
888 浏览

java - 有没有办法在 Java 中实现代数类型?

在 Java 中,是否有可能强制一个类具有一组特定的子类而没有其他子类?例如:

我可以以某种方式强制不能创建 A 的其他子类吗?

0 投票
1 回答
2021 浏览

c# - C#抽象类,使用匿名而不是声明具体类?

我有一个抽象类,我想通过不创建继承抽象类的具体类来快速使用它。好吧,匿名定义抽象方法。

像这样的东西:

在 C# .net 2.0 中有可能吗?

0 投票
6 回答
56993 浏览

unit-testing - 测试抽象类

如何使用 PHPUnit 测试抽象类的具体方法?

我希望我必须创建某种对象作为测试的一部分。虽然,我不知道这个的最佳实践,或者 PHPUnit 是否允许这样做。

0 投票
7 回答
138997 浏览

java - 为什么实现接口的抽象类可能会错过接口方法之一的声明/实现?

当您使用抽象类来实现接口时,Java 中会发生一件奇怪的事情:接口的某些方法可能完全丢失(即既不存在抽象声明,也不存在实际实现),但编译器不会抱怨。

例如,给定接口:

以下抽象类在没有警告或错误的情况下被愉快地编译:

你能解释一下为什么吗?

0 投票
4 回答
2215 浏览

java - 接口的骨架实现中的抽象方法

我正在重新阅读 Effective Java (2nd edition) item 18, prefer interfaces to abstract classes。在该项目中,Josh Bloch 提供了Map.Entry<K,V>接口的骨架实现示例:

这个例子有两个问题:

  1. 为什么这里将 getKey 和 getValue 显式声明为抽象方法?它们是Map.Entry接口的一部分,所以我看不出抽象类中冗余声明的原因。
  2. 为什么要使用将这些原始方法(正如 Bloch 先生所说的那样)保留为抽象的习语?为什么不这样做:

    // 骨架实现 public abstract class AbstractMapEntry implements Map.Entry { private K key; 私人V值;

    }

这样做的好处是每个子类不必定义自己的字段集,并且仍然可以通过其访问器访问键和值。如果子类确实需要为访问器定义自己的行为,它可以直接实现 Map.Entry 接口。另一个缺点是在骨架实现提供的 equals 方法中,抽象访问器被调用:

Bloch 警告不要从为继承而设计的类中调用可覆盖的方法(第 17 项),因为它会使超类容易受到子类所做更改的影响。也许这是一个见仁见智的问题,但我希望确定这个故事是否还有更多内容,因为布洛赫在书中并没有真正详细说明这一点。

0 投票
4 回答
12045 浏览

c# - 抽象类的准确使用

抽象类的确切用途是什么?普通类不能像抽象类那样做同样的事情吗?

0 投票
7 回答
10146 浏览

c# - 我可以强制子类覆盖方法而不使其抽象吗?

我有一个带有一些抽象方法的类,但我希望能够在设计器中编辑该类的子类。但是,设计者不能编辑子类,除非它可以创建父类的实例。所以我的计划是用存根替换抽象方法并将它们标记为虚拟 - 但是如果我创建另一个子类,如果我忘记实现它们,我将不会收到编译时错误。

有没有办法标记方法,以便它们必须由子类实现,而不将它们标记为抽象?