public class Car
{
public char color;
public char getColor()
{
return color;
}
public void setColor(char color)
{
this.color = color;
}
}
public class MyCar
{
private Car car = null;
public MyCar()
{
this.car = new Car();
car.color = 'R';
}
}
上述代码违反了哪个OOPS原则? •抽象 •封装 •多态性 •以上都不是
我知道Encapsulation是这个问题的答案。只是想知道其他选项是否也是如此。
答案 0 :(得分:5)
好吧,我会用这些术语来看待它:
封装:通过允许直接访问color
字段,Car
类正在公开实现细节。 Ignacio已经表明他不会将这种类型的违规视为封装,而是数据隐藏 - 我自己对“封装”一词的看法是它包含数据隐藏。这只是为了说明如何以不同的方式使用这些词。
多态性:通过名称MyCar
和Car
判断应该可能实现公共接口或具有公共基类。至少,给出的类不能多态使用。
抽象:我认为使用char
作为颜色的抽象是不合适的。是否违反抽象取决于“抽象违规”的含义。
答案 1 :(得分:0)
如果public char color;
代替private char color;
,那么它就是封装的一个例子。这是因为在您当前版本的代码中,值立即设置,这是一个实现细节。例如,您可以决定添加验证 - 例如,仅允许大写字符。通过允许直接设置字段color
,无法执行验证。
答案 2 :(得分:0)
Car中违反了信息隐藏。
我认为其他原则正式得到尊重,即。如果两个类不打算以多态方式使用,那么就没有什么能阻止我将MyCar类包装到Car类中。
有人可能会说这只是糟糕的设计,我同意。
同样适用于使用char作为颜色:它可能是糟糕的设计,但IMHO没有正式反对OOP原则。
答案 3 :(得分:0)
根据我的理解,“数据隐藏”被违反。当您暴露内部时 Car类(颜色)的详细信息,您也可以公开它,任何人都可以使用Valid或In Valid值修改它。 现在看看Encapsulation OOP原理: 封装:它没有被违反,因为相关数据保存在一个干净的封闭容器中,这里是类,并且汽车信息不会分散在这里和那里。
答案 4 :(得分:0)
根据OOPs Concept,您的代码违反数据隐藏。因为你在类级别声明公共变量并且在方法同一类中也使用它。如果您违反了数据隐藏,则意味着您还违反了封装。
public class Car
{
public char color;
public char getColor()
{
return color;
}
public void setColor(char color)
{
this.color = color;
}
}
在上面的代码中,您违反了数据隐藏概念。因为颜色变量可以在课堂外直接访问。上述代码也违反了封装。