面向对象编程(OOPs)的问题

5
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原则?
• 抽象 • 封装 • 多态 • 以上都不是

我理解封装是这个问题的答案。只是想知道其他选项是否也正确。

5个回答

6

我认为应该这样看待:

  • 封装:允许直接访问 color 字段Car 类正在暴露实现细节。Ignacio 已经表明他不认为这种类型的违规是封装违规,而是数据隐藏违规——我对“封装”一词的理解是它包括数据隐藏。这说明这些词语可以以不同的方式使用。

  • 多态性:根据名称 MyCarCar,应该潜在地实现一个公共接口或有一个共同的基类。至少,给定的类不能用于多态。

  • 抽象化:我认为使用 char 作为颜色的抽象化是不适当的。无论这是否属于抽象化违规,都取决于您对“抽象化违规”的理解。


0
根据我的理解,“数据隐藏”被违反了。因为您暴露了Car类(颜色)的内部细节,同时您将其公开暴露,任何人都可以使用有效或无效值进行修改。 现在看看封装OOP原则: “封装”:它没有被违反,因为相关数据被保留在一个干净封闭的容器中,这里是类,而且汽车信息并没有散落在各处。

0
如果public char color;改为private char color;,那么这将是封装的一个例子。这是因为在您当前版本的代码中,该值立即设置,但这是一种实现细节。例如,您可以决定添加验证 - 例如仅允许大写字符。通过允许直接设置color字段,无法执行该验证。

0

信息隐藏在汽车中被违反了。

我认为其他原则是正式被尊重的,也就是说,如果这两个类不打算被多态使用,那么没有什么阻止我拥有一个包装Car类的MyCar类。

有人可能会认为这只是糟糕的设计,我也同意。

同样适用于将char用作颜色:这可能是糟糕的设计,但在我看来,没有什么形式上违反面向对象编程原则的东西。


0
根据面向对象编程的概念,您的代码违反了数据隐藏。因为您在类级别上声明了公共变量,并在同一类的方法中使用它。如果您违反了数据隐藏,那么也违反了封装
public class Car 
{
   public char color;

   public char getColor()
   {        
     return color;    
   }    

   public void setColor(char color)
   {       
     this.color = color;    
  }
 }

在上面的代码中,您正在违反数据隐藏概念。因为颜色变量可以直接在类外部访问。上述代码还违反了封装

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接