我正在努力理解坚实的原则。我想我很理解Liskov替换原理,但是对于其他的,我有一些问题。
举一个例子。我有两个接口:Engine和car stereo。问题是:对于一辆车,我们有6副眼镜。
所以,我的车实现了Engine和Car Stereo接口。
但是对于6种眼镜,我应该实现它们,还是应该将它们放置在一系列的眼镜上,知道有4种侧面的眼镜可以向上或向下,还有2块挡风玻璃(glasses由两者继承)。
第一个问题是,我不能实现4倍同一副眼镜。
因此,第二个似乎是好的,但我担心,打破SRP,我不知道什么是确切的“责任”。
发布于 2015-09-21 06:57:28
正确的设计方法是
要接口的代码,而不是类。
根据这一原则,我建议使用像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
}https://stackoverflow.com/questions/30514833
复制相似问题