簡體   English   中英

闡述多態

[英]Elaborating on Polymorphism

我已經閱讀了有關多態的關於stackoverflow的許多問題。 這個問題是結構化我的想法的問題,因為我已經閱讀並研究了很多東西,以至於我想到了很多想法。 我需要對我關於多態性的想法進行評論和批評。 我將使用Java演示我的想法。

多態性是談論某個實體時具有不同形式的特征。 可以通過以下方式實現:

  • 派生類從其基類繼承所有可見的方法,因此可以override某些方法的行為。 例如:

     class Shape { void draw(){ System.out.println("I am drawing using a shape object"); } } class Rectangle extends Shape{ void draw(){ // This method is overriden System.out.println("I am drawing using a rectangle object"); } } 

這里實現多態的方式是,如果在運行時draw()Rectangle的實例一起使用,則將調用Rectangle類中的draw()的實現。

因為矩形是一個形狀,所以多態性是draw()取決於調用它的上下文采用不同形式的事實。 這也稱為繼承多態性。

  • 實現多態的另一種方法是通過接口。

     interface Vehicle{ void move(); } class Car implements Vehicle{ void move(){ System.out.println("The car is moving!"); } } class Plane implements Vehicle{ void move(){ System.out.println("The plane is flying!"); } } // we declare an object of type Vehicle // At compile-time, the concrete implementation of someVehicle is no known // and thus polymorphism is achieved in the sense that someVehicle could // either be a Car or a Plane depending on which concrete class is used // to instantiate it at run-time. Vehicle someVehicle; 
  • 用戶定義的運算符重載(不是在Java中,而是在C ++中)

在Java中,運算符重載的一個示例是+運算符,其中取決於操作數,+執行某些功能。 如果將+應用於字符串,則將它們連接起來。 如果將其應用於整數,則會進行算術加法。

現在,方法重載也是實現多態的一種方法嗎? 我對多態性的了解錯過了什么?

多態性一詞的意思是“許多形式”

您提供的兩個示例是絕對有效的多態示例:

  • 在第一個示例中,您具有“繪制”功能的“許多形式”,具體取決於您在哪種形狀上調用“繪制”對象

  • 在第二個中,您具有“移動”功能的“多種形式”,具體取決於車輛

由於后期綁定 ,將在運行時確定將要調用的實際方法。

實際上,這兩個示例都非常相似,並且都是子類型化的示例,這是您在Java中實現多態的方式。

請注意,在Java中需要子類型化,因為Java是一種靜態類型的語言。 在像Smalltalk這樣的動態類型語言中,即使對象的類不屬於同一類層次結構,也可以使用不同的“ draw”方法實現。

現在,關於方法重載 :的確,如果您定義了一個接收不同參數類型的方法的多個版本,則該方法也將具有“許多形式”。

區別在於,在這種情況下, 要在編譯時決定調用哪種方法 這就是為什么許多人將方法重載稱為靜態多態性

但是,由於它是靜態的,並且您可以通過為方法指定不同的名稱並根據所使用的類型確定要調用的方法,從而基本上可以實現相同的目的,因此許多人還會說方法重載並不是實際上是多態的。

我認為這基本上取決於您要使用的“多態性”的定義,但是我希望以上解釋有助於弄清差異。

我認為您對Java中發生的其他事情感到困惑。 運算符重載是其他編程語言(例如C ++)中多態的一種形式,但是在Java中,它們是諸如ints和booleans之類的基元與其他擴展基本java.lang.Object的事物之間的區別。 語言設計人員決定不要在類中使用運算符重載,因為這可能會造成很大的混亂。 因此,您在Java中沒有有效的運算符多態性,因為您無法定義自己的運算符或覆蓋其他運算符,但toString()方法除外,但這在我看來確實是一個接口。 我認為您不能說+(對於字符串)運算符是java中運算符重載的一個示例,即使使用字符串也是如此,它是被調用的toString()方法,在我看來,這並不是真正的運算符重載,因為當您將規則應用於執行操作的順序時,運算符僅具有該術語。 如果您只有一個運算符,則+可以使字符串組合在一起,因此永遠不會應用評估順序的規則,因此在語法上很簡單。 您有用於整數和浮點數的+,-,/運算符,但是您不能重載它們,所以這不是多態性。

多態行為的行為與您解釋的方式相同,但並不是實現覆蓋先前定義的方法的新方法的實際行為。 多態性更多是一個抽象的想法。 一般來說:

多態是對象采取多種形式的能力。 當使用父類引用來引用子類對象時,會在OOP中最常見地使用多態。

更多信息也可以在這里找到。

暫無
暫無

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

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