簡體   English   中英

為什么要煩擾抽象或接口類?

[英]Why bother with abstract or interface classes?

這令人難以理解為什么最好有一個抽象類。 所以我要說我必須計算不同形狀的區域(圓形,矩形)。 我被教會更好地擁有一個抽象/界面形狀,然后像Rectangle,Circle這樣的類擴展它。

我做了以下代碼

abstract class Shape {
    abstract int getArea();
} 

class Rectangle extends Shape{
    private int width;
    private int height;

    public Rectangle (){
        this.width = width;
        this.height = height;
    }

    // get set methods ommited

    public int getArea () {
        return width * height;
    }
}

看起來形狀類沒有用處。 我不能在形狀類中執行getArea的實現,因為不同的形狀會以不同的方式計算區域。 我可以刪除shape類並使我的代碼更簡單。

那么具有抽象/接口類形狀的實際目的是什么? 提前感謝您的任何解釋

看起來形狀類沒有用處。 我不能在形狀類中執行getArea的實現,因為不同的形狀會以不同的方式計算區域。 我可以刪除shape類並使我的代碼更簡單。

假設您有一個由多個形狀組成的圖片 - 一些圓形,一些矩形等。您可以將所有這些形狀存儲在List<Shape> ,然后使用以下方法計算總面積:

int totalArea = 0;
for (Shape shape : shapes) {
    totalArea += shape.getArea();
}

如果你沒有常見的Shape類或接口,你會怎么做? 您的Picture類必須知道每個單獨的形狀類,而不是使用不同形狀類之間的通用性來使代碼更通用。

另一個例子,考慮流。 想象一下,我們沒有InputStream類 - 我們只有各個子類。 然后每次編寫必須讀取某些數據的代碼時,您必須為您希望能夠處理的每個子類提供重載,即使每個方法中的代碼完全相同。 InputStream抽象出差異,暴露了常見的功能(閱讀,跳過等)。 這樣你就可以編寫一個只接受InputStream方法,然后使用FileInputStreamByteArrayInputStream等調用它......而不需要關心它接收哪一個方法。

如果要傳遞給任意Shape的方法,您可以執行以下操作:

public void method(Shape shape) {
   int area = shape.getArea();
}

這稱為多態性。 如果沒有抽象類或接口,則無法執行此操作。

如果要根據共享的某些行為或屬性對類進行分組,可以使用接口或抽象類。 這將允許您使用接口/抽象類作為參數類型或泛型。 例如,在您的情況下,您可以執行以下操作:

  1. 創建不同形狀的List <Shape>
  2. 將形狀傳遞給方法。 假設您在Shape類/接口上有一個方法getArea() 您可以在其實現中使用getArea()方法的whichIsGreater (Shape shape1, Shape shape2) getArea()方法中使用它。

使用接口或抽象類還有一個非常重要的方面。 為您的類定義一個抽象類(或接口)可以顯示您的代碼設計的意圖 有人會選擇你的代碼,通過正確定義的繼承來理解它的任務會更容易。

良好代碼設計的目標並不是真正編寫盡可能短的代碼。 它是關於有效但也清晰且自我記錄的代碼。

為了完整答案,我重復了其他答案中提出的一些觀點 - 沒有任何不尊重的意圖。

在您的特定情況下,Shape應該是一個interface而不是一個abstract class interface基本上是一個abstract class ,只有public方法而沒有實現。 當您能夠實現對所有或至少大多數實現子類都正確的特定方法時, abstract class是有意義的。 在這種情況下,這是“不要重復自己”(DRY)原則的應用。

為什么要煩擾抽象類或接口?

因為現在你可以只有一個List<Shape> ,你可以在其中放入各種不同的形狀,你不需要關心它究竟是哪種形狀。 JVM將為您完成工作,並選擇它必須選擇哪個getArea實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM