java - 为什么使用类型替换

标签 java oop types liskov-substitution-principle

谁能向我解释一下使用类型替换的必要性是什么?

例如

class Circle extends Shape{
   ...
}

.
.
.

class Main{
   public static void main(String[] args){
       Shape s = new Circle();
       ...
   }
}

从上面的代码我们能得到什么可能的好处?通常情况下,

public static void main(String[] args){
    Circle c = new Circle();
}

可以轻松完成所需的工作。

最佳答案

这种现象称为通过继承实现的多态性。这意味着您的行为是在运行时决定调用哪个对象而不是调用哪个引用。

嗯。让我们进一步扩展你的例子。让我们首先创建类层次结构

class Shape{
      public void draw(){}
}

class Circle extends Shape{
      public void draw(){
          //mechanism to draw circle
      }
}

class Square extends Shape{
      public void draw(){
          //mechanism to draw square
      }
}

现在让我们看看这如何产生干净的代码

class Canvas{
     public static void main(String[] args){
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle());
        shapes.add(new Square());

        // clean and neat code

        for(Shape shape : shapes){
              shape.draw();
        }

     }
 }

这也有助于构建松耦合系统

 Class ShapeDrawer{
     private Shape shape;  

     public void setShape(Shape shape){
         this.shape = shape;
     }

     public void paint(){
         shape.draw(); 
     } 

 }

在这种情况下,ShapeDrawer 与实际形状的耦合非常松散。 ShapeDrawer 甚至不知道它正在绘制哪种类型的 Shape,甚至不知道它如何绘制的机制是从中抽象的。可以更改绘制特定形状的底层机制,而不会影响此类。

关于java - 为什么使用类型替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651066/

相关文章:

php - 访问兄弟类方法

对象外的JavaScript函数封装

c++ - void* (*)() 和 void* 有什么区别?

java - 来自 aws-java-sdk 的 DynamoDB 在 gradle 下不完整

java - Android 开发(按钮和 XML 布局)

C# 有抽象类和接口(interface),它也应该有 "mixins"吗?

math - 是否有用于在非标准分析中进行计算的超真实数据类型实现?

c++ - : Bit, byte 和 int 哪个更有效?

java - 使用 BeanComparator 和 Collat​​or 对集合进行排序

java - 读取整个 XML 文件并存储在内存中 java