小编Cri*_*ike的帖子

使用默认接口方法实现方法 - 矛盾吗?

介绍

我已经在SO上阅读了关于实现接口和抽象类的多篇帖子.我特别想找到一个我想链接的地方 - 链接 - 接口与默认方法vs抽象类,它涵盖了同样的问题.作为公认的答案,建议在可能的情况下使用接口的默认方法.但是这个答案下面的评论说"这个功能对我来说更像是黑客"解释了我的问题.

引入了默认方法以使接口的实现更加灵活 - 当接口发生更改时,实现类中不一定需要(重新)编写代码.因此,使用接口的默认方法只是为了实现所有实现类中的方法 - 引用:"感觉更像是对我的黑客攻击".

我考试的例子:

课程概述:

  • Item - 所有项目的抽象超类
  • 水 - 消耗品
  • 石头 - 非消耗品
  • 消耗品 - 与消耗品的某些方法接口(这些方法必须被所有实施类覆盖)

结合这些:

水是物品并实施消耗品; Stone也是一个项目,并没有实现消耗品.

我的考试

我想实现一个所有项目必须实现的方法.因此,我在类Item中声明了签名.

protected abstract boolean isConsumable(); 
//return true if class implements (or rather "is consumable") Consumable and false in case it does not
Run Code Online (Sandbox Code Playgroud)

快速编辑:我知道instanceof可以解决这个特定的例子 - 如果可能的话,想一个更复杂的例子,这使得有必要首先实现该方法.(感谢Sp00m和Eugene)

现在我有几个选择:

  1. 在Item的每个子类中手动实现该方法(在扩展应用程序时绝对不可能).

如上所述,当缩放应用程序时,这将是不切实际或非常低效的.

  1. 在接口内部实现方法作为默认方法,因此Consumable类已经实现了超类Item所需的方法.

这是其他帖子推荐的解决方案 - 我看到以这种方式实现它的优势:

引用 - "关于这个新功能的好处是,在你被迫使用抽象类来实现方便方法之前,从而将实现者限制为单继承,现在你可以只使用接口和一个非常干净的设计最少的实施工作强加给程序员." 链接

但在我看来,我在介绍中提到的默认方法的最初想法似乎仍然是矛盾的.此外,在扩展应用程序并引入更多共享相同实现的方法(作为示例方法isConsumable())时,接口将实现几个默认方法,这与未实现实际方法的接口的想法相矛盾.

  1. 引入子超类而不是接口 - 例如类Consumable作为Item的抽象子类和Water的超类.

它提供了为Item(示例isConsumable() //return false:)中的方法编写默认大小写的机会,然后在子超类中重写它.此处出现的问题:在扩展应用程序并引入更多子超类(作为Consumable类)时,实际的Items将开始扩展多个子超类.这可能不是一件坏事,因为它也必须对接口做同样的事情,但它使继承树变得复杂 - 示例:一个项目现在可能扩展子类别ALayer2,它是ALayer1的子超类,它扩展了Item(layer0) . …

java inheritance interface java-8 default-method

12
推荐指数
1
解决办法
240
查看次数

使用 Karma 进行 Angular 单元测试 - 被测组件未在浏览器中呈现

我目前正在尝试使用最新版本的 Angular 为 Angular 项目编写单元测试。我遇到了组件未在测试浏览器(Chrome)中渲染的问题。经过几个小时的搜索并尝试搞乱配置后,我决定退后一步,将当前项目与遗留项目进行比较。我在同一台机器上测试了这两个项目,旧版本可以按预期工作。降级依赖项(Karma、Jasmine)不是一个选项,因为最新的 Angular 版本显然需要更高的版本(我没有找到任何相关文档)。

作为最后一个选择,我决定生成一个干净的项目(Angular CLI 12.2.6)并将其与在线教程进行比较(用于比较的示例教程)。问题依然存在。除了报告的测试结果之外,浏览器中不会呈现任何输出。

缺少模板渲染

更令人困惑的是,调试期间输出是可见的:

在此输入图像描述

问题

如何实现当前被测组件在测试浏览器中呈现?

我想我在这里遗漏了一些明显的东西。如果这可能与问题有关,那么单击测试浏览器中的调试按钮也会显示“%X_UA_COMPATIBLE%”。快速在线搜索没有得到任何有用的结果。

对此问题的任何帮助表示赞赏。

如果需要,添加下面的测试代码:

依赖项(默认 CLI v12.2.6)

"dependencies": {
    "@angular/animations": "~12.2.0",
    "@angular/common": "~12.2.0",
    "@angular/compiler": "~12.2.0",
    "@angular/core": "~12.2.0",
    "@angular/forms": "~12.2.0",
    "@angular/platform-browser": "~12.2.0",
    "@angular/platform-browser-dynamic": "~12.2.0",
    "@angular/router": "~12.2.0",
    "rxjs": "~6.6.0",
    "tslib": "^2.3.0",
    "zone.js": "~0.11.4"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~12.2.6",
    "@angular/cli": "~12.2.6",
    "@angular/compiler-cli": "~12.2.0",
    "@types/jasmine": "~3.8.0",
    "@types/node": "^12.11.1",
    "jasmine-core": "~3.8.0",
    "karma": "~6.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage": "~2.0.3",
    "karma-jasmine": "~4.0.0",
    "karma-jasmine-html-reporter": "~1.7.0",
    "typescript": "~4.3.5"
  }
Run Code Online (Sandbox Code Playgroud)

Karma 配置(除了自定义启动器之外的默认设置):

module.exports = function (config) { …
Run Code Online (Sandbox Code Playgroud)

unit-testing typescript karma-jasmine angular

5
推荐指数
1
解决办法
1420
查看次数