我们可以实现一个接口到es6类的方式非常简单:
interface IDog {
bark(): void
}
class Dog implements IDog {
bark(): void {
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何为这个"类"实现相同的接口:
const Dog = function() {
}
Dog.prototype.bark = function() {
}
Run Code Online (Sandbox Code Playgroud)
我尝试将狗的类型定义为IDog : const Dog: IDog. 没工作.
所以,我需要它来实现依赖倒置,我无法弄清楚如何使用es5类来做到这一点.我看到经典继承风格是Javascript中的"反模式",所以我决定以旧方式创建类,并需要帮助实现Typescript接口.
在问这个问题之前我想说的是问题与我的问题非常相似,但概念仍然不清楚,非常令人困惑。
\n\n我试图理解依赖倒置原理,但我无法完全理解它?
\n\n下面是DIP说的两点
\n\n\n\n\nA. 高层模块不应该依赖于低层模块。两者都应该依赖于抽象。B. 抽象不应依赖于细节。细节应该取决于抽象。
\n
我能够理解第一点,但无法理解第二点,看起来两者是相同的。在 stackoverflow 和其他网站进行大量搜索后,我可以理解两者都试图说不同的事情,但我无法理解。
\n\n让\xe2\x80\x99s 考虑一个例子:
\n\n让\xe2\x80\x99s考虑SalaryCalculator类[高级模块],它用于计算员工的工资。其中使用BonusCalculator [高级模块]来计算工资,如下所示。由于 SalaryCalculator 使用 BonusCalculator,它\xe2\x80\x99s 违反了\xe2\x80\x9c 的第一点,高级模块不应依赖于低级模块。两者都应该依赖于抽象\xe2\x80\x9d。
\n\n\n\n因此我们在两者之间引入了抽象,如下所示:
\n\n\n\n这里的细节[低级和高级模块]依赖于抽象,而抽象不依赖于细节。那么在 DIP 中,第二点试图说明什么?\n 如果两者相同,为什么将其分为两点?
\n\n如果有人给我一个代码示例,那将非常有用。
\noop inversion-of-control design-principles solid-principles dependency-inversion
只是对 Stack Overflow 和 Microsoft 开发社区的一个想法和一个关于称为 SOLID 的 OO 软件设计原则的问题。请问Liskov替换原则和依赖倒置原则有什么区别?我已经考虑了一段时间,但我不确定其中的区别。请问你能告诉我吗?非常欢迎任何想法/反馈。
liskov-substitution-principle solid-principles dependency-inversion
" 代码到接口 "被认为是良好的做法.这样的代码易于单元测试并且可以实现松耦合.用户只知道接口和布线具体对象的责任在最顶层(这可以在一些初始化代码中或在框架的帮助下完成).
我的问题是关于遵循接口的代码实践:它是否暗示具体类永远不能声明其接口中不存在的任何公共方法?
否则,它将迫使用户依赖具体实现.这将使这种方法难以进行单元测试; 如果测试失败,确定它是否由于调用者代码中的问题或由于具体方法而失败将需要额外的努力.这也将打破依赖倒置原则.它会引起类型检查和向下转换,这被认为是不好的做法.
我正在尝试将接口和设置传递给一个类,同时在 .Net Core 项目的 startup.cs 中创建该类的实例。我正在使用下面的代码来做到这一点。我在 Student 类的构造函数中编写了一些代码,但是在启动应用程序时,构造函数中的代码/逻辑不起作用。没有错误,但调试指针没有命中 Student 类的构造函数。
services.AddSingleton(c => new Student(settings, resourceSetting, c.GetService<IPersonService>()));
Run Code Online (Sandbox Code Playgroud)
如果我使用下面的代码,那么 Student 构造函数中的代码工作正常。
Student studentHandler = new Student(settings, resourceSetting,);
services.AddSingleton<Student>(studentHandler);
Run Code Online (Sandbox Code Playgroud)
但是我需要在构造函数中传递 Service 接口才能在启动项目时做一些工作。任何人都可以帮助我解决我在这里缺少的东西吗?
c# startup asp.net-core dependency-inversion asp.net-core-webapi
oop ×2
asp.net-core ×1
c# ×1
interface ×1
javascript ×1
liskov-substitution-principle ×1
startup ×1
typescript ×1