这个问题是在一次采访中提出的。
家具可以由一种或多种材料制成。家具种类繁多,如椅子、桌子、沙发等。
家具测试取决于材料和家具类型。很少有测试是可选的,耐火的,WithStands100KgWeight的等等。
在OOAD中设计这个。该设计应遵循开放关闭原则,并应乐观,以便在未来如果增加新家具,它不应该需要更多的代码改变。
最初建议
class Furniture{
List<Material> materials;
boolean supportsTest(Test test);
}
class Chair extends Furniture{
boolean supportsTest(Test test){
// check material and based on type return true/false
}面试官说,家具是家具,不应该说它支持不支持这个测试。有其他解决办法吗?谢谢。
发布于 2014-05-27 11:42:21
根据你的描述和面试官的评论,这就是我所想到的:
// An interface so that it's separate from Furniture class
interface FurnitureTest {
bool IsSupportedBy(Furniture furniture);
}
// Sample test, can add as many as you like
class FireResistable : FurnitureTest {
public bool IsSupportedBy(Furniture furniture) {
return furniture.Type.Name == ! "Mirror" && /* just to use the Type property */
!furniture.HasMaterial(x => x == "Wood");
}
}
///
/// Other class definitions.
///
// Open to extension
class Chair : Furniture { /* additional properties */ }
class Table : Furniture { /* additional properties */ }
// Closed to modification
class Furniture {
public FurnitureType FurnitureType { get; private set; }
private IList<Material> materials;
public Furniture(FurnitureType type, IList<Material> materials) {
this.materials = materials;
}
public bool HasMaterial(string materialName) {
return materials.Any(x => x.Name == materialName);
}
}
class FurnitureType {
public string Name { get; set; }
// ...other properties
}
class Material {
public string Name { get; set; }
// other properties..
}https://stackoverflow.com/questions/23887409
复制相似问题