我刚刚进入了依赖倒置原理和控制反转,而且从我目前所知(如果我错了,请纠正我)是DIP声明
高级模块/类不应该依赖于低级模块/类
高级和低级模块都不应该依赖于细节(不确定这是什么意思?),而是抽象(接口)
但是当我编写一个简单的程序来实现这个原则时,我遇到了一个问题(稍后会解释)
我的程序包含一个实现“ICharacterable”
的Inventory和Player类 class Player : ICharacterable {
private int _health = 100;
public int Health{
get{
return _health;
}
}
public int HealthIncrease(int health){
//increase health
return _health + health;
}
}
class Inventory{
ICharacterable player = null;
//constructor injection
public Inventory(ICharacterable player) {
this.player = player;
}
//increase player health
public void UseHealthPotion(int health) {
player.HealthIncrease(health);
}
}
class Program{
static void Main(string[] args) {
Player john = new Player();
Inventory inv = new Inventory(john);
inv.UseHealthPotion(30);
Console.WriteLine(john.Health);
}
}
//interface
public interface ICharacterable {
int HealthIncrease(int health);
}
问题是,控制台返回100而不是130.我认为问题是由于我声明注入ICharacterable类型而不是播放器(但这会违反DIP)引起的,无论如何我可以这样做吗?感谢
答案 0 :(得分:2)
这不是依赖注入问题,你在这里的代码中只有一个错误:
public int HealthIncrease(int health){
//increase health
return _health += health;
}
答案 1 :(得分:1)
结果不好,因为您的方法只返回添加结果而不更改对象的状态。其他一切都是正确的。将其更改为:
public int HealthIncrease(int health){
//increase health
_health += health;
return _health;
}
你应该只考虑小替换,在我看来播放器应该包含库存,而不是反过来。然后你将遵循OOP设计模式,你的代码会更好。
高级模块/类不应该依赖于低级别 模块/类
在这种情况下播放器 =高级别课程和广告资源 =低级别课程
高级和低级模块都不应该依赖于细节(不确定这是什么意思?),而是抽象(接口)
快速解释:
抽象 =界面或抽象类。非常容易理解,它是您的 ICharactable 界面。
详细信息 =实施。这是您的库存类。是什么让你的代码与这个原则兼容。