当前位置: 首页 > 知识库问答 >
问题:

Angular2中,使用继承还是注入依赖?

鲜于温书
2023-03-14

在angular2中,假设我有一个Parent类和一个Child1类,它们具有相同的属性/成员和方法。如何初始化Child1类?

服务

@Injectable()
export class Parent {  
    constructor(
        private currentImg: string,
        private catImg: string,
        private dogImg: string,
        private enable: boolean) {
    }

    onMouseOver() {
        enable = true;
        currentImg = catImg;
    }

    onMouseClick() {
        enable = false;
        currentImg = dogImg;
    }

}

其中一个子类要扩展类:

import {Parent} from "./Parent";

@Component({
    selector: 'app',
    templateUrl: 'app/child.html',
    providers: [Parent]
})

export class Child1 {

     private currentImg: string = "img/dog.png",
     private catImg: string = "img/cat.png",
     private dogImg: string = "img/dog.png",
     private enable: false

    constructor(private _parent: Parent) {
    }

    onMouseOver() {
        this._parent.onMouseOver();
    }

    onMouseClick() {
        this._parent.onMouseClick();
    }
}

共有1个答案

冯祺
2023-03-14

当你扩展一个类时,主类可以使用基类的方法和属性。

export class Base {  
    private image: string = "img/dog.png"; // default image
    // you don't need catImg and dogImg here...
    // private catImg: string;
    // private dogImg: string;
    private currentImg: string;
    private enable: boolean;

    constructor() { }

    onMouseOver(image) {
        enable = true;
        currentImg = image;
    }

    onMouseClick(image) {
        enable = false;
        currentImg = image;
    }

}

当您想在主类中设置属性时,您不必在基类中为它们初始化/设置值。您只需要声明您在Base类中使用的那些属性和方法。您可以设置类将共享的常见属性,例如默认Image

这是在两个不同的类中扩展基类的方式:

import {Base} from "./Base";

@Component({
    selector: 'app',
    template: `<button (click)="onMouseClick(image)">show cat</button>`,
    providers: []
})
export class CatImage extends Base {

    private image: string = "img/cat.png",
    constructor() { 
      super();
    }
}

@Component({
    selector: 'app',
    template: `<button (click)="onMouseClick(image)">show dog</button>`,
    providers: []
})
export class DogImage extends Base {

    private image: string = "img/dog.png",
    constructor() { 
      super();
    }
}

CatImageDogImage 都将从基类继承 enablecurrentImg 属性、onMouseOver() 和 onMouseClick() 方法,您可以在它们的代码/模板中使用它们。

 类似资料:
  • 如何使用新的Angular 2.3组件继承在子组件和父组件之间共享依赖注入? 例如,我想将AlertService移到父组件中,并将TraingCompanyService留在派生组件中 当前组件 重构组件 (V1) 在派生类的构造函数中调用Super之前,必须先调用它 重构组件(V2) 类培训公司编辑组件错误地扩展基类 BaseAdminEditComponent,类型具有单独的私有属性声明“a

  • 我有一个超类型(CaseDTO),其中有几个子类型(GroupCaseDTO,IPCaseDTO),我想注入。开发环境是JDev 12c。 以下是两个注射点: > @将@CaseContext private CaseDTO muwCase注入; 注入特定子类型(此注入点仅适用于一个子类型): @将@CaseContext private GroupCaseDTO muwCase注入; 为了获得这

  • 问题内容: 我正在使用将..NET Core添加到Redis连接,它当前看起来像这样: 然后在 这意味着我可以在任何地方进行依赖注入。 我的问题是:是可以重复使用,所以我用,以保持一个实例整个应用程序。但是我也可以在请求期间使用一个。哪个更好?为什么? 问题答案: 该应用程序的预期负载是多少?如果您有很多并发性,我认为使用将意味着为每个请求启动和关闭连接的大量不必要的负担。 同样,恕我直言,这些观

  • 我有一个注释和三个类,像这样: 有没有办法确定当前注释是直接在类中继承还是声明的? 类似于方法<代码>公共布尔值的东西是默认的(类 导出输出:

  • 问题内容: 您对此设计决定有何看法?它有什么优点和缺点? 链接: 嵌入说明 问题答案: 在注释中,您想知道嵌入的想法是否足以“完全替换继承”。我会说这个问题的答案是“是”。几年前,我使用名为Snit的Tcl OO系统进行了非常简短的介绍,该系统使用组合和委派来排除继承。Snit与Go的方法仍然有很大不同,但是在这一方面,它们具有一些共同的哲学基础。这是一种将功能和职责结合在一起的机制,而不是类的层

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A