Class Abstrak

Class Abstrak - C lass

===

8.4. Class Abstrak

Salah satu tanda kita telah menggunakan OOP dengan benar adalah seberapa banyak kita meninggalkan statement if. Coba kita tengok lagi Class termometer yang telah kita

b uat.

1. Tidak ada kaitan a ntara nama dengan besaran suhu. 2. Mestinya secara intuitif ketika kita mengubah ke Celsius yang didapat adalah Celsius bukan double, sehingga ketika nilai keluaran ini kita tangkap, yang kita dapat adalah sebuah nilai bebas. 3. Kita masih ada 2 termometer lagi Kelvin dan Rheamour, dengan cara diatas bukan pekerjaan yang mudah untuk menambahkan dua termometer ini.

Termometer. Apa yang terbayang di benak anda ketika mendengar kata ini. Alat pengukur suhu. Disini kita juga menanbahkan kem ampuan husus sebagai alat pengkonversi suhu. Tetapi ketika anda hendak mengukur suhu yang anda butuhkan adalah wujud nyata dari termometer misalnya, Celsius, Fahrenheit, Kelvin. Disini termometer adalah abstrak. Sedangkan Celsius dan kawan-kawan adalah kongkrit. Secara abstrak termometer mempunyai kemampuan mengukur dan mengkonversi. Anda tidak akan bisa mengukur atau mengkonversi dengan tool yang hanya dalam teori atau masih dalam fikiran dan kata-kata.

Anda harus mencari tool yang nyata, kongkrit. Tool tersebut dikatakan termometer jika dia mempunyai kemampuan yang sama dengan termometer dalam fikira/teori. Dengan

d emikian Celsius harus mengimlementasikan, menyed iakan kemampuan-kemampuan te rmometer abstrak jika ingin disebut termometer. Demikian juga dengan Kelvin, Fahrenheit dll. Dengan cara seperti ini pengguna termo meter tidak akan kebingungan, sebab semua thermometer mempunya i cara/kemampuan minimal yang sama. Mengapa s aya katakana minimal, sebab ada kemungkinan pabrik pembuat tool akan menambahkan kemampuan lain yang tidak ada dalam terori termometer.

Menghubungkan antara yang abstrak dengan yang kongkrit dalam OOP disebut sebagai mengg eneralisasi, hubungannya disebut inheritance, kadan g saya menyebutnya turunan, dengan pengertian tidak 100%. Model hubungannnya terlihat dalam diagram berikut ini:

Termometer

#_name : string #_temp : double

+ToCels() : Termometer +ToFahr() : Termometer +ToString() : string +GetName() : string +GetTemp() : double

+ToCels() : Termometer

+ToCels() : Termometer +ToCels() : Termometer

+ToFahr() : Termometer

+ToFahr() : Termometer +ToFahr() : Termometer

Gambar 8-1. Hubungan inheritance diimplementsikan dalam bentuk anak panah, tanpa

ekor

Hubungan Class termomete kita wujudkan dalam code sebagai berikut.

names pac e EBook . OpenSour c e. Bab8 {

publ i c abs t r ac t c l as s Ter momet er {

publ i c Ter momet er ( doubl e t emper at ur ) {

t hi s . _t emp =t emper at ur ; 1

publ i c a bs t r ac t Ter momet er ToCel s ( ) ; 2

publ i c abs t r a c t Ter momet er ToFahr ( ) ; 3

pu bl i c ov er r i de s t r i ng ToSt r i ng( )

r et ur n t hi s . Get Temper at ur ( ) . ToSt r i ng( ) + 4 " der aj at " + t hi s . Get Name( ) ;

publ i c s t r i ng Get Name( )

r et ur n t hi s . _name; 5

publ i c doubl e Get Temper at ur ( )

{ r et ur n t hi s . _t emp;

pr ot ec t ed doubl e _t emp;

pr ot ec t ed s t r i ng _name; 6

publ i c c l as s Cel s : Ter momet er { p ubl i c Cel s ( doubl e Temper at ur ) : bas e( Temper at ur ) publ i c c l as s Cel s : Ter momet er { p ubl i c Cel s ( doubl e Temper at ur ) : bas e( Temper at ur )

} publ i c ov er r i de Ter momet er ToCel s ( ) {

8 r et ur n t hi s ;

} publ i c ov er r i de Ter momet er ToFahr ( ) {

doubl e f ahr Temp;

f ahr Temp=9* t hi s . Get Temper at ur ( ) / 5 9 + 32;

Fahr f =new Fahr ( f ahr Temp) ;

r et ur n f;

pub lic c l as s Fahr : Ter momet er 0

{ publ i c Fahr ( doubl e Temper at ur ) : bas e( Temper at ur ) {

b as e. _name=" Fahr enhei t " ; } publ i c ov er r i de Ter momet er ToCel s () {

doubl e c el s Temp;

c el s Temp=5* ( t hi s . Get Temper at ur ( ) - 32) / 9;

Cel s c =new Cel s ( c el s Temp) ; r et ur n c;

} publ i c ov er r i de Ter mome t er ToFahr ( ) {

r et ur n t hi s ; }

pu bl i c c l as s Kel v : Ter momet er {

publ i c Kel v ( doubl e Temper at ur ) : bas e( Temper at ur ) {

t hi s . _name=" Kel v i n" ; } publ i c ov er r i de Ter momet er ToCel s ( ) {

doubl e c el s Temp;

c el s Temp=t hi s . Get Temper at ur ( ) - 273. 16; Cel s c =new Cel s ( c el s Temp) ; r et ur n c;

} publ i c ov er r i de Ter momet er ToFahr ( ) {

r et ur n t hi s . ToCel s ( ) . ToFahr ( ) ;

Konstruktor Class abstrak berparameter tunggal, temperatur. Class ini akan kita buat menjadi base-class dari Class-Class kongkrit. Class in i meyimpan data tipe termometer dan suhu termometer. Kedua data ini modifier-nya pro tected yang berarti bisa diakses turunannya, tetapi tidak dari Class yang bukan turunannya.

Definisi method abstract dari ToCels. Method abstract tidak ada implementasi, hanya definisi saja . Class kongkrit yang diturunkan dari Class ini harus mengimplemenasikan fungsi yan gm asih abstrak ini.

D efini m thod e abstract dari ToFahr. Kita men g-override method ToString dari class object. Di C# semua Class sebetulnya

d iturunka n dari Class object ini. Lebih jauh tentang override kita akan bahas dibagian la in dar i bab ini. Ini adalah a ksessor untuk nama. Anda bisa juga menggunakan properti, tapi saya tidak akan membah as dalam bab ini. Data kita de klarasikan protected agar bisa diakses dari Class turunannya. Perhatikan bagaimana Class kongkrit diturunkan dari Class abstrak. N ama_Class : nama_Class_b astrak.

Perhatikan _name yang berada di Class abstrak bisa d iakses dari turunannya. Sementara suhu kita bisa set dari base constructor-nya. Anda juga b isa perlakukan suhu seperti _nam e.

Dua method abstrak ya ng harus diimplementas ikan adalah ToCels dan ToFahr. Untuk m engimplementasikannya kita harus memakai keyword override. Perhatikan bagaimana method abstrak diimplementasikan.

Impelementasi method ToFahr. Perhatikan keluaran dari method ini Termometer, padahal kita meng-create objek Fahrenheit. Hal ini bisa dilakukan karena class

F ahrenheit diturunkan dari Class abstrak termometer.

us i ng Sy s t em; us i ng EBook . OpenSour c e. Bab8; na me sp ac e ConTes t {

c l as s Uni t Tes t { s t at i c v oi d Mai n( )

{ Tes t Temp1( ) ; Cons ol e. ReadLi ne( ) ;

pr i v at e s t at i c v oi d Tes t Temp1( )

{ Cel s c =new Cel s ( 100) ;

Fahr f =new Fahr ( 212) ; 1

Cons ol e. Wr i t eLi ne( " =====Cel s ======" ) ; pr i nt Tem p1( c ) ;

Cons ol e. Wr i t eLi ne( " =====Fahr ======" ) ; pr i nt Temp1( f ) ; Cons ol e. Wr i t eLi ne( " =====Kel v ======" ) ; Kel v k =new Kel v ( 373. 16) ; pr i nt Temp1( k ) ;

pr i v at e s t at i c v oi d pr i nt Temp1( Ter momet er 2 t emp1)

{ Cons ol e. Wr i t eLi ne( " { 0} s ama dengan { 1} " ,

t emp1. ToSt r i ng( ) , t emp1. ToCel s ( ) . ToS t r i ng( ) ) ;

Cons ol e. Wr i t eLi ne( " { 0} s ama dengan { 1} " ,

t emp1. ToSt r i ng( ) ,

t emp1. ToFahr ( ) . ToSt r i ng( ) ) ;

Perhatikan objek celsius dan fahrenheit kita buat langsung dengan memakai Class kongkrit. Perhatikan bagaimana method p rintTemp1 me-refer kedua object hanya melalaui Class

a bstraknya. Konsep ini hampir sama dengan konsep interface yang akan kita bahas di bab selanjutnya.