我想了解SOLID原则。我想我很了解利斯科夫替代原则,但我对其他原则有些疑问。
一个例子。我有两个界面:Engine
和car stereo
。
问题是:对于汽车,我们有6个眼镜。
所以,我的汽车实现了接口Engine
和Car Stereo
。
但是对于6副眼镜,我应该实施它们,还是应该将它们放在一副眼镜上,因为知道有4个可以向上或向下的侧面眼镜和2个挡风玻璃(glasses
由两个继承)。
第一个问题是,我无法实现相同眼镜的4倍。
所以第二个对我来说似乎很好,但我害怕打破SRP,我不确定是什么"责任"确实是。
答案 0 :(得分:1)
正确的设计实践是
代码接口而不是类。
根据这一原则,我建议使用IWindow
,ISurface
,IWindShield
这样的界面,其层次结构如下
interface ISurface
{
//surface specific properties which ideally should be DI-ed
public SurfaceType SurfaceType {get; set;}
public decimal Opacity {get;set;}
public decimal Thickness {get; set;}
}
和
interface IWindow:ISurface
{
//Window behavior specific properties and methods
public void lowerWindow();
public WindowHeight WindowLevel(){get;set;}
public void shutWindow();
// ...and more such window specific behavior
}
和
interface IWindShield:ISurface
{
//WindShield behavior specific properties and methods
public bool IsFogged(){get;set;}
public bool IsClean(){get;set;}
// ...and more such window specific behavior
}
最后,当组装具有所有功能的汽车(可能使用Builder模式)时,您可以在类型ISurface
类型的Car类中拥有一个数组,如下所示
class Car
{
string carName;
Engine carEngine;
Stereo carStereo;
List<ISurface> carGlasses;
.....
// other Car parts
// this is a typical builder pattern example
}
这是使用CarBuilder
类型类构建MyCarBuilder
其中
interface CarBuilder
{
public Car MyCar {get; set;}
void AddEngine();
void AddStereo();
void AddGlasses();// this is what works on adding ISurface List items
// and other car building methods
}
和真正的构建器类
class MyCarBuilder:CarBuilder
{
//... implements all methods of building your custom car
}
答案 1 :(得分:0)
这实际上取决于预期用途,但让我们以汽车功能域(现场发明)为例。
你的实现类将实现IMotor(Tesla D有两个电机),IEntertainmentCentre(希望有一个),IGlassSurface(在SUV中可能相当多)。在每个界面中,您将指定要寻址的电机/玻璃表面,例如:IGlassSurface.Operate(glassSurfaceId,direction,distance)。