接口和抽象类

3
关于接口和抽象类,下列哪些说法是不正确的?(至少标记两个答案)
a. 抽象类支持继承关系但不支持实现关系。
b. 接口支持实现关系但不支持继承关系。
c. 抽象类和接口都支持继承关系。
d. 上述所有陈述都是正确的。
我对答案有点困惑,能否有人帮助我。我猜是a、b、d。

实际上你只有三个选项 :) d 可以忽略(至少标记两个答案),即使这样,选项在逻辑上仍然冲突 - jmj
从逻辑上讲,c不能为假而d为真。 - Peter Lawrey
2个回答

2
你所面对的问题表述不清,没有明确的定义,因此无法得出合理的正确答案。正如其他人指出的那样,选项(d)会带来逻辑上的矛盾。但是,问题仍然存在歧义。
继承和实现是二元关系。因此,关于抽象类或接口是否“支持”它们,没有单一的答案。相反,你必须问:每个分类器(抽象类、接口)在每个关系(继承、实现)中可以扮演什么角色?为了简单起见,我们称这些角色在两种情况下都为“父母”和“子女”。虽然语义不正确,但对于我们的目的已足够。但为避免混淆:
- 对于继承: “父母”表示从中继承的分类器,“子女”表示继承分类器。 - 对于实现: “父母”表示定义规范的分类器,“子女”表示提供实现的分类器。
最后,我们需要定义“继承”和“实现”的含义。由于你标记了这个问题是Java相关的,我们可以假设“继承”意味着“extends”,“实现”意味着“implements”。然而,这是一个非常有争议的继承定义 - 它通常意味着实现继承。这与Java的“extends”不同。
好了。现在我们可以为每个分类器可以扮演的角色定义一个真值表。
               |  Inheritance  |   Realisation  |
               |parent | child | parent | child |
---------------|-------|-------|--------|-------| 
Abstract Class |   T   |   T   |    F   |   T   |
Interface      |   T   |   T   |    T   |   F   |
-------------------------------------------------

从中我们可以看到:
1. 抽象类支持继承关系中的两个角色。 2. 抽象类只支持实现关系中的一个角色。
另外需要注意的是,如果“继承”意味着“实现继承”而不是“扩展”,那么表格会有所不同。
现在让我们来看看你问题中的选项:
a. 抽象类支持继承关系而不支持实现关系。
如果没有定义“支持”的含义,我们无法确定其真假。抽象类支持继承关系中的两个角色,所以第一条是正确的。然而,它们只支持实现关系中的一个角色。那么这是否意味着它们支持它呢?除非明确将“支持”定义为“完全支持” - 两个角色 - 或“部分支持” - 至少一个角色,否则就没有答案。
对于你列表中的选项(b)也存在类似的歧义。
但是选项(c)是可以确定的。接口和抽象类都支持继承关系中的两个角色,因此(c)是正确的。请注意,如果“继承”意味着“实现继承”而不是“扩展”,那么(c)就是错误的。
总之:如果没有正确定义问题,就无法回答问题。

在Sun(Oracle?)认证的Java程序员考试中,有很多这种格式的问题。它们的定义非常糟糕。 - Mauricio

1

哦,回忆啊...这是针对Java认证程序员的吗?

a. 真
b. 假
c. 真
d. 是真还是假?我认为是...假

而且你必须否定答案...
查看此处以获取有关抽象类接口的更多信息。


我认为抽象类通过允许方法定义来支持实现。支持 - “在次要或从属角色中行动”并不意味着它必须完成所有所需的工作。在我看来。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接