-->

Pengertian Abstrak dan Interface Pada Pemograman Java

Kali ini saya membahas kelas Shape dengan subclass Rectangle, Oval, dan RoundRect yang mewakili jenis bentuk tertentu. Masing-masing kelas mencakup metode redraw (). Metode redraw () di kelas Rectangle menggambar persegi panjang. Metode redraw () di kelas Oval menarik oval. Metode redraw () di kelas RoundRect menggambar persegi panjang bulat. Apa metode redraw () yang ada di kelas Shape? Bagaimana seharusnya itu didefinisikan?

Jawabannya mungkin mengejutkan: Kita harus membiarkannya kosong! Faktanya adalah bahwa Shape kelas mewakili gagasan abstrak sebuah bentuk, dan tidak ada cara untuk menarik benda semacam itu. Hanya bentuk beton tertentu seperti persegi panjang dan oval yang bisa digambar. Jadi, mengapa harus ada metode redraw () di kelas Shape? Nah, itu harus ada di sana, atau akan ilegal untuk menyebutnya dalam metode setColor () kelas Shape, dan akan menjadi ilegal untuk menulis "oneShape.redraw ();", di mana satuShape adalah variabel tipe Bentuk.

Namun demikian versi redraw () di kelas Shape tidak akan pernah disebut. Sebenarnya, jika Anda memikirkannya, tidak akan pernah ada alasan untuk membangun objek tipe Shape yang sebenarnya! Anda dapat memiliki variabel tipe Shape, namun objek yang mereka lihat akan selalu termasuk dalam salah satu subclass Shape. Kami mengatakan bahwa Shape adalah kelas abstrak. Kelas abstrak adalah salah satu yang tidak digunakan untuk membangun objek, namun hanya sebagai dasar pembuatan subclass. Kelas abstrak hanya ada untuk mengekspresikan sifat umum semua subclassnya.

Demikian pula, kita bisa mengatakan bahwa metode redraw () di kelas Shape adalah metode abstrak, karena tidak pernah dimaksudkan untuk dipanggil. Sebenarnya, tidak ada yang bisa dilakukan - setiap penggambaran ulang yang sebenarnya dilakukan dengan metode redraw () di subclass Shape. Metode redraw () di Shape harus ada di sana. Tapi hanya ada yang bisa memberi tahu komputer bahwa semua Shape mengerti pesan redrawnya. Sebagai metode abstrak, ia hanya ada untuk menentukan antarmuka umum semua versi beton aktual redraw () di subclass Shape. Tidak ada alasan untuk redraw abstrak () di kelas Shape untuk mengandung kode sama sekali.

Metode bentuk dan redraw () secara semantik abstrak. Anda juga bisa memberi tahu komputer, secara sintaktis, bahwa mereka abstrak dengan menambahkan pengubah "abstrak" ke definisi mereka. Untuk metode abstrak, blok kode yang memberi penerapan metode biasa digantikan oleh titik koma. Implementasi harus disediakan untuk metode abstrak dalam subclass konkret kelas abstrak. Inilah kelas Shape yang akan terlihat seperti kelas abstrak:

abstract class Shape {
       
           Color color;   // color of shape. 
                                     
           void setColor(Color newColor) {
                 // method to change the color of the shape
              color = newColor; // change value of instance variable
              redraw(); // redraw shape, which will appear in new color
           }
           
           abstract void redraw();
                 // abstract method -- must be redefined in 
                 // concrete subclasses

           . . .          // more instance variables and methods

       } 


Setelah Anda melakukan ini, menjadi ilegal untuk mencoba membuat objek 
tipe Shape sebenarnya,dan komputer akan melaporkan kesalahan jika Anda mencoba melakukannya.
Di Java, setiap kelas yang Anda nyatakan memiliki superclass. Jika Anda 
tidak menentukan superclass, maka superclass secara otomatis diambil menjadi 
Object, sebuah kelas yang telah ditentukan yang merupakan bagian dari 
paket java.lang. (Objek kelas itu sendiri tidak memiliki superclass, 
tapi satu-satunya kelas yang memiliki properti ini.) Jadi,

                            class myClass { . . .
is exactly equivalent to
class myClass extends Object { . . .

Setiap kelas lainnya, secara langsung atau tidak langsung, merupakan subkelas dari Objek. Ini berarti bahwa setiap objek, termasuk dalam kelas apapun, dapat ditugaskan ke variabel tipe Object. Objek kelas mewakili sifat yang sangat umum yang dimiliki oleh semua objek, termasuk dalam kelas manapun. Objek adalah kelas yang paling abstrak!Kelas Objek benar-benar menemukan penggunaan dalam beberapa kasus di mana objek dari jenis yang sangat umum dimanipulasi. Sebagai contoh, java memiliki kelas standar, java.util.Vector, yang mewakili daftar Objects. (Kelas Vector ada dalam paket java.util Jika Anda ingin menggunakan kelas ini dalam program yang Anda tulis, biasanya Anda akan menggunakan pernyataan impor untuk memungkinkannya menggunakan nama pendek, Vector, alih-alih nama lengkap, Lihat bagian 2.6 untuk diskusi tentang paket dan impor.) Kelas Vector sangat mudah, karena Vektor dapat menyimpan sejumlah objek, dan itu akan tumbuh, bila perlu, karena benda ditambahkan ke dalamnya. Karena item dalam daftar adalah tipe Object, daftar sebenarnya dapat menyimpan objek dari jenis apa pun.

Sebuah program yang ingin melacak berbagai Bentuk yang telah digambar di layar dapat menyimpan bentuk-bentuk itu di dalam sebuah Vektor. Anggaplah bahwa Vector diberi nama listOfShapes. Sebuah bentuk, satuShape, dapat ditambahkan ke akhir daftar dengan memanggil metode contoh "listOfShapes.addElement (oneShape);". Bentuknya bisa dihapus dari daftar dengan "listOfShapes.removeElement (oneShape);". Jumlah bentuk dalam daftar diberikan oleh fungsi "listOfShapes.size ()".) Dan mungkin untuk mengambil objek ke-i dari daftar dengan memanggil fungsi "listOfShapes.elementAt (i)". (Item dalam daftar diberi nomor dari 0 sampai listOfShapes.size () - 1. Namun, perhatikan bahwa metode ini mengembalikan Objek, bukan Bentuk (Tentu saja, orang-orang yang menulis kelas Vektor bahkan tidak tahu tentang Bentuk !) Karena Anda tahu bahwa item dalam daftar sebenarnya adalah Bentuk dan bukan hanya Objek, Anda dapat mengetikkan Objek yang dikembalikan oleh listOfShapes.elementAt (i) menjadi nilai tipe Shape :

Shape s = (Shape)listOfShapes.elementAt(i);


Mungkin berguna untuk melihat applet yang benar-benar menggunakan kelas Shape abstrak dan Vector untuk menyimpan daftar bentuk:
Jika Anda mengklik salah satu tombol di sepanjang bagian bawah applet ini, sebuah bentuk akan ditambahkan ke layar di sudut kiri atas applet. Warna bentuknya diberikan oleh "Choice menu" di kanan bawah. Begitu bentuknya ada di layar, Anda bisa menyeretnya dengan mouse. Sebuah bentuk akan mempertahankan tatanan front-to-back yang sama sehubungan dengan bentuk lain di layar, bahkan saat Anda menyeretnya. Namun, Anda dapat memindahkan bentuk di depan semua bentuk lainnya jika Anda menekan tombol shift saat Anda mengkliknya.

Dalam applet ini, satu-satunya saat ketika kelas sebenarnya dari bentuk yang digunakan adalah saat bentuk itu ditambahkan ke layar. Begitu bentuknya telah diciptakan, ia dimanipulasi seluruhnya sebagai bentuk abstrak. Rutinitas yang menerapkan menyeret, misalnya, hanya bekerja dengan variabel tipe Shape. Saat Shape diseret, rutinitas menyeret memanggil metode menggambar Shape berulang-ulang. Shape bertanggung jawab untuk menggambar dirinya dengan benar. Jika saya ingin menambahkan tipe bentuk baru ke program ini, saya akan menentukan subkelas baru Shape, menambahkan tombol lain ke applet, dan memprogram tombol untuk menambahkan jenis bentuk yang benar ke layar. Tidak ada perubahan lain dalam pemrograman yang diperlukan.


Anda mungkin ingin melihat kode sumber untuk applet ini, ShapeDraw.java, meskipun Anda tidak dapat memahami semuanya saat ini. Bahkan definisi kelas bentuk agak berbeda dari yang saya jelaskan di bab ini. (Misalnya, metode draw () yang digunakan pada applet memiliki parameter tipe Graphics. Parameter ini diperlukan karena cara Java menangani semua gambar.) Saya akan kembali ke contoh ini di bab berikutnya ketika Anda tahu lebih banyak tentang applet. . Namun, tetap layak untuk melihat definisi kelas Shape dan subkelasnya dalam kode sumber untuk applet. Anda juga dapat memeriksa bagaimana Vector digunakan untuk menyimpan daftar bentuk di layar.



Interfaces

Beberapa bahasa pemrograman berorientasi objek, seperti C ++, memungkinkan sebuah kelas memperpanjang dua atau lebih superclasses. Ini disebut multiple inheritance. Dalam ilustrasi di bawah ini, misalnya, kelas E ditunjukkan memiliki kelas A dan kelas B sebagai superclass langsung, sedangkan kelas F memiliki tiga superclass langsung.


Beberapa warisan semacam itu tidak diperbolehkan di Java. Perancang Java ingin agar bahasa tetap sederhana, dan merasa bahwa manfaat multiple inheritance tidak sebanding dengan biaya dalam kompleksitas yang meningkat. Namun, Java memang memiliki fitur yang bisa digunakan untuk mencapai banyak tujuan yang sama seperti multiple inheritance: interface.

Kami telah menemukan istilah "antarmuka" sebelumnya, sehubungan dengan kotak hitam pada umumnya dan subrutin pada khususnya. Antar muka subrutin terdiri dari nama subrutin, jenis kembaliannya, dan jumlah dan jenis parameternya. Ini adalah informasi yang perlu diketahui jika Anda ingin memanggil subrutin. Sebuah subrutin juga memiliki implementasi: blok kode yang mendefinisikannya dan yang dieksekusi saat subrutin dipanggil.

Di Java, Interface adalah kata yang dicadangkan dengan makna tambahan. Sebuah "antarmuka" di Java terdiri dari satu set antarmuka subrutin, tanpa implementasi yang terkait. Kelas dapat mengimplementasikan antarmuka dengan menyediakan implementasi untuk masing-masing subrutin yang ditentukan oleh antarmuka. (Antarmuka juga bisa mencakup definisi konstanta - yaitu, variabel dinyatakan sebagai static final. Konstanta ada di sana sebagai kemudahan untuk memberi nama yang berarti untuk jumlah tertentu.) Berikut adalah contoh antarmuka Java yang sangat sederhana:

public interface Drawable {
          public void draw();
       }


Ini terlihat seperti definisi kelas, kecuali bahwa penerapan metode draw () 
dihilangkan. Kelas yang mengimplementasikan antarmuka Gambar harus memberikan
implementasi untuk metode ini. Tentu saja, itu juga bisa termasuk
metode dan variabel lain. Sebagai contoh,


 class Line implements Drawable {
            public void draw() {
                . . . // do something -- presumably, draw a line
            }
            . . . // other methods and variables
         }


Sementara kelas hanya bisa memperpanjang satu kelas lainnya, ia bisa 
mengimplementasikan sejumlah antarmuka. Sebenarnya, kelas bisa memperluas 
kelas lain dan menerapkan satu atau lebih antarmuka. Jadi, kita bisa 
memiliki hal-hal seperti

class FilledCircle extends Circle 
                                implements Drawable, Fillable {
           . . .
        }

Maksudnya semua ini adalah, meski antarmuka bukan kelas, 
itu adalah sesuatu yang sangat mirip. Antarmuka sangat 
mirip kelas abstrak, yaitu kelas yang tidak dapat digunakan 
untuk membangun objek, namun dapat digunakan sebagai basis 
untuk membangun kelas lainnya. Subrutin dalam sebuah antarmuka 
adalah metode abstrak, yang harus diimplementasikan di kelas 
beton manapun yang mengimplementasikan antarmuka. Dan seperti 
kelas abstrak, meskipun Anda tidak dapat membangun sebuah objek 
dari sebuah antarmuka, Anda dapat mendeklarasikan sebuah variabel 
yang jenisnya diberikan oleh antarmuka. Misalnya, jika Drawable
adalah sebuah antarmuka, dan jika Line and FilledCircle adalah 
kelas yang mengimplementasikan Drawable, Anda bisa mengatakan:


 Drawable figure = new Line();  // variable of type Drawable, referring
                                      //   to an object of class Line
       . . .    // do some stuff with figure
       figure.draw();   // calls draw() method from class Line
       figure = new FilledCircle();   // now, figure refers to an object
                                      //   of class FilledCircle
       figure.draw();   // calls draw() method from class FilledCircle


Variabel tipe Drawable dapat merujuk ke objek dari kelas manapun yang mengimplementasikan 
antarmuka Drawable. Sebuah pernyataan seperti 
figure.draw (), di atas, adalah legal karena 
setiap kelas tersebut memiliki metode draw ().
Perhatikan bahwa tipe adalah sesuatu yang bisa 
digunakan untuk mendeklarasikan variabel. Jenis 
juga dapat digunakan untuk menentukan jenis 
parameter dalam subrutin, atau jenis fungsi kembali.
Di Java, tipe bisa berupa kelas, antarmuka, atau satu 
dari delapan tipe primitif bawaan. Inilah satu-satunya 
kemungkinan. Dari jumlah tersebut, hanya kelas yang bisa 
digunakan untuk membangun objek baru.
Anda tidak mungkin perlu menulis antarmuka Anda 
sendiri sampai Anda sampai pada titik penulisan program yang 
cukup kompleks. Namun, ada beberapa antarmuka yang digunakan 
dengan cara yang penting dalam paket standar Java. 



Sumber Referensi : http://www.dcs.bbk.ac.uk/~mirkin/sp109/javanotes/c4/s3.html



Berlangganan update artikel terbaru via email:

0 Response to "Pengertian Abstrak dan Interface Pada Pemograman Java"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel