Üçüncü bölümde sınıfların diğer sınıflardan kalıtım (Inheritance) yoluyla türetilmesini görmüştük. Sınıfları kalıtım yoluyla birbirinden türetirken eğer ortak özellikli sınıflar yaratıyorsak, bütün bu sınıf gurubunun en tepesine abstract bir sınıf koyabiliriz. Abstract sınıfın diğer sınıfların kullanılmasında extends yoluyla tepe sınıflık etmek ve bütün alt sınıflara ortak bir adres çıkış noktası sağlamak dışında bir görevi yoktur. Diğer bir deyimle bu sınıflar hiçbir zaman doğrudan kullanılmazlar. Ancak alt sınıflarından birini referans olarak göstermek ve onlara dolaylı yoldan ulaşmak amacıyla kullanılırlar.
Kavramı daha
iyi verebilmek için bir örnek problem oluşturalım. Daha önce sınıf kavramını
açıklarken kullandığımız nokta,daire sınıflarını hatırlıyacaksınız. Şimdi
bu sınıfların üzerine sekil isimli bir abstract sınıf ekleyerek tekrar
oluşturalım.
Program
5.1 Abstract sınıf sekil (
sekilX.java
dosyasında yer alıyor)
public abstract class sekilX
{
//not burada başka değişkenlerde olabilir
public double alan(){return 0.0;}
public double hacim() {return 0.0;}
public abstract String isim();
}
Program 5.2: sekil sınıfından kalıtım yoluyla türetilen noktaX sınıfı
import sekilX;
public class noktaX extends sekilX
{
protected double x, y;
public noktaX(double a, double b)
{
x=a;
y=b;
}
public void noktagir(double a, double b)
{
x=a;
y=b;
}
public double Xoku()
{
return x;
}
public double Yoku()
{
return y;
}
public String toString()
{
return "["+x+","+y+"]";
}
public String isim() {return "nokta";}
}
Program 5.3: noktaX sınıfından kalıtım yoluyla türetilen daireX sınıfı
import noktaX;
public class daireX extends noktaX
{
protected double yaricap;
public daireX()
{
//daire kalıtım yaptığı nokta sınıfının kurucu metodunu
// super deyimi ile cagirabilir.
super(0,0);
yaricapgir(0);
}
public daireX(double r, double a, double b)
{
super(a,b);
yaricapgir(r);
}
public void yaricapgir(double r)
{
if(r >= 0.0)
yaricap=r;
else
yaricap=0.0;
}
public double yaricapoku()
{
return yaricap;
}
public double alan()
{
return 3.14159*yaricap*yaricap;
}
public String toString()
{
return "Merkez = "+"["+x+","+y+"]"+
"; Yaricap="+yaricap;
}
public String isim() {return "daire";}
}
Program
5.4: daireX sınıfından kalıtım yoluyla türetilen
silindirX
sınıfı
import daireX;
public class silindirX extends daireX
{
protected double yukseklik;
public silindirX()
{
yukseklikoku(0);
}
public silindirX( double h, double r, int a, int b)
{
super(r, a, b );
yukseklikoku( h);
}
public void yukseklikoku (double h )
{
if(h>=0) yukseklik=h;
else yukseklik=0;
}
public double yukseklikoku(){return yukseklik;}
public double alan()
{
return 2* super.alan()+
2*Math.PI*yaricap*yukseklik;
}
public double hacim(){return super.alan()*yukseklik;}
public String toString()
{return super.toString()+";yukseklik="+yukseklik;}
public String isim(){return "silindir";}
}
Program 5.4 : Abstract
sınıf ve indirek referanslamayı test eden
abstracttesti
sınıfı
import java.awt.Graphics;
import java.applet.Applet;
public class abstracttesti extends Applet
{
private noktaX n;
private daireX d;
private silindirX s;
private sekilX a[];
public void init()
{
n = new noktaX(7,11);
d = new daireX(3.5,22,8);
s = new silindirX(10,3.3,10,10);
a = new sekilX[3];
a[0]=n;
a[1]=d;
a[2]=s;
}
public void paint(Graphics g)
{
//direk cagirma :
g.drawString(n.isim()+": "+n.toString(),25,25);
g.drawString(d.isim()+": "+d.toString(),25,40);
g.drawString(s.isim()+": "+s.toString(),25,55);
//indirek cag�rma
int y=85;
for(int i=0;i<a.length;i++)
{
g.drawString(a[i].isim()+": "+a[i].toString(),25,y);
y+=15;
g.drawString("Alan : "+a[i].alan()+" Hacim : "+a[i].hacim(),25,y);
y+=15;
}
}
}
05001.JPG
Şekil 5.1 Abstract sınıf ve indirek referanslamayı test eden
abstractTesti sınıfının sonuclarının applet de görülmesi
Program 5.5 : Abstract
sınıf ve indirek referanslamayı test eden
abstractTesti_2000.java
import javax.swing.JOptionPane;
import silindirX;
import noktaX;
import daireX;
public class abstractTesti_2000
{
public static void main(String args[])
{
noktaX n;
daireX d;
silindirX s;
sekilX a[];
n = new noktaX(7,11);
d = new daireX(3.5,22,8);
s = new silindirX(10,3.3,10,10);
a = new sekilX[3];
a[0]=n;
a[1]=d;
a[2]=s;
String st="";
st+=n.isim()+": "+n.toString()+"\n";
st+=d.isim()+": "+d.toString()+"\n";
st+=s.isim()+": "+s.toString()+"\n";
//indirek cağırma
int y=85;
for(int i=0;i<a.length;i++)
{
st+=a[i].isim()+": "+a[i].toString()+"\n";
st+="Alan : "+a[i].alan()+" Hacim : "+a[i].hacim()+"\n";
}
JOptionPane.showMessageDialog(null,st,"abstract test programı",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
05002.JPG
Şekil 5.2 Abstract sınıf ve indirek referanslamayı test eden abstractTesti_2000 sınıfının sonuclarının JoptionPane çıktısı olarak görülmesi
Örnekten de görüldügü gibi nokta, daire ve silindir abstract sekil sınıfının alt sınıfları olarak oluşturulmuş, ve aynı zamanda bu sınıflara indirek referans olarak kullanılmıştır. Diğer bir deyimle nokta daire ve silindirin adresleri sekil sınıfı nesneye aktarılmış ve bu nesne üzerinden üç sınıfta indirek olarak kullanılmıştır. Bu indirek kullanımın bize temel faydası, Programımıza yeni sınıflar eklediğimizde daha kolay ve az program değiştirerek uyumu sağlayabilme yeteneğidir. Orneğin yukarıdaki program sınıfları gurubuna koni eklemek istersek bütün yapacağımız koni sınıfını tanımladıktan sonra, sekil nesnesi a nın boyutunu bir arttırarak aynı hesaplamaya koniyide ilave etmekten ibaret olacaktır. Bu tür uygulamalar bilgisayar kodunun değişim gereksinimini minimuma indirgediğinden nesne kokenli bilgisayar programcılığının onemli uygulamalarından biridir.
Abstract sınıfların dezavantajı sadece bir sınıfın kalıtım yoluyla ve extends sozcüğü kullanılarak bağlanabilir olmasıdır. Ve eğer başka bir sınıf halihazırda o sınıfa kalıtım yoluyla bağlanmışsa, bizim yeni bir sınıfı üst sınıf olarak kullanma olasılığımız yok olmuş demektir. Fakat bazı uygulamalar için bu gerekebilir.Bu zaman interface kullanırız. Interface de abstract sınıf gibi kendi içinde bir işlem yapmaz. Sadece öbür sınıfların bağlanmasını teşkil eden bir adres noktası olarak iş görür. İnterface’i bir başka sınıfa bağlamak gerektiğinde extends yerine implements sözcüğü kullanılır. Abstract sınıflar kendi başına bir bütün teşkil edebilmelerine rağmen interface’in sadece kendi başına bir anlamı yoktur. Interface sınıfında yer alan tüm metod ve değişkenlerin alt sınıflarda tanımlanması gerekir.
Örnek olarak bir önceki problemi interface ile tanımlıyalım.
Program 5.5 interface sekil ( sekilY.java dosyasında yer alıyor)
public interface sekilY
{
//burada de§iŸken veya nesnelerde olabilir
public abstract double alan();
public abstract double hacim();
public abstract String isim();
}
Program 5.6 : interface sekilden implements kelimesiyle türeyen noktaY sınıfı ( noktaY.java dosyasında yer alıyor)
import sekilY;
public class noktaY implements sekil
{
protected double x, y;
public noktaY(double a, double b)
{
noktagir(a,b);
}
public void noktagir(double a, double b)
{
x=a;
y=b;
}
public double Xoku()
{
return x;
}
public double Yoku()
{
return y;
}
public double alan() {return 0.0;}
public double hacim() {return 0.0;}
public String toString()
{
return "["+x+","+y+"]";
}
public String isimOku()
{
return "Nokta";
}
}
Görüldüğü gibi burada nokta sınıfının bir öncekinden farkı implements kelimesinin kullanılmış olaması ve bos alan ve hacim metotlarının bu dosyada yazılmasının gerekmesinden ibarettir. Interface programla yapılan ve alt sınıflarda bu metodların (veya değişkenlerin) tanımlanacağına dair yapılan bir kontrattır.DaireY ve silindirY sınıflarında bir fark mevcut degildir. İki seklin işlemsel sonuçları arasında da bir fark mevcut değildir.
Yukardaki örneğe parelel olarak burada da daireY,SilindirY tanımlarını yapalım ve interfaceTesti_2000.java programında test edelim.
Program 5.6 : interface sekilY’den implements kelimesiyle türeyen noktaY sınıfından extends yoluyla türeyen daireY sınıfı( daireY.java dosyasında yer alıyor)
import noktaY;
public class daireY extends noktaY
{
protected double yaricap;
public daireY()
{
//daire kalıtım yaptığı nokta sınıfının kurucu metodunu
// super deyimi ile cagirabilir.
super(0,0);
yaricapgir(0);
}
public daireY(double r, double a, double b)
{
super(a,b);
yaricapgir(r);
}
public void yaricapgir(double r)
{
if(r >= 0.0)
yaricap=r;
else
yaricap=0.0;
}
public double yaricapoku()
{
return yaricap;
}
public double alan()
{
return 3.14159*yaricap*yaricap;
}
public String toString()
{
return "Merkez = "+"["+x+","+y+"]"+
"; Yaricap="+yaricap;
}
public String isim() {return "daire";}
}
Program 5.7 : interface sekilY’den implements kelimesiyle türeyen noktaY sınıfından extends yoluyla türeyen daireY sınıfından extends yoluyla türeyen silindirY sınıfı( silindirY.java dosyasında yer alıyor)
import daireY;
public class silindirY extends daireY
{
protected double yukseklik;
public silindirY()
{
super(0, 0, 0 );
yukseklikoku(0);
}
public silindirY( double h, double r, int a, int b)
{
super(r, a, b );
yukseklikoku( h);
}
public void yukseklikoku (double h )
{
if(h>=0) yukseklik=h;
else yukseklik=0;
}
public double yukseklikoku(){return yukseklik;}
public double alan()
{
return 2* super.alan()+
2*Math.PI*yaricap*yukseklik;
}
public double hacim(){return super.alan()*yukseklik;}
public String toString()
{return super.toString()+";yukseklik="+yukseklik;}
public String isim(){return "silindir";}
}
Program 5.8 : interface sekilY’den türeyen sınıfları test eden ve indirek olarak referanslıyan interfaceTesti_2000.java programı
import javax.swing.JOptionPane;
import silindirY;
import noktaY;
import daireY;
public class interfaceTesti_2000
{
public static void main(String args[])
{
noktaY n;
daireY d;
silindirY s;
sekilY a[];
n = new noktaY(7,11);
d = new daireY(3.5,22,8);
s = new silindirY(10,3.3,10,10);
a = new sekilY[3];
a[0]=n;
a[1]=d;
a[2]=s;
String st="";
st+=n.isim()+": "+n.toString()+"\n";
st+=d.isim()+": "+d.toString()+"\n";
st+=s.isim()+": "+s.toString()+"\n";
//indirek cağırma
int y=85;
for(int i=0;i<a.length;i++)
{
st+=a[i].isim()+": "+a[i].toString()+"\n";
st+="Alan : "+a[i].alan()+" Hacim : "+a[i].hacim()+"\n";
}
JOptionPane.showMessageDialog(null,st,"interface test programı",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
05003.JPG
Şekil 5.2 interface sınıf ve indirek referanslamayı test eden interfaceTesti_2000 sınıfının sonuclarının JoptionPane çıktısı olarak görülmesi
1. Derste gördüğümüz abstract class sekilX,noktaX,daireX, silindirX sınıflarına ve ilave olarak koniX sınıfını yaratınız. Bu sınıfların sekiltestiX.java test sınıfında alanlarını ve hacimlerini sekilX referansını kullanarak yazdırınız.
2. Derste gördüğümüz interface sekilY, noktaY,daireY, silindirY sınıflarına ve ilave olarak küreY sınıfını yaratınız. Bu sınıfların sekiltesti.java testY sınıfında alanlarını ve hacimlerini sekilY referansını kullanarak yazdırınız.
3. H5AL1.java programını inceleyiniz. Bu program bir boyutlu abstract sınıf fx ve bu sınıfta tanımlanan abstract metot f(double x) i kullanan turev ve integral metodlarını içerir. İntegral ve türev metodlarını niçin abstact kavramı kullanarak yazdığımızı açıklayınız.
Program 5.7 H5AL1.java, fx ve H5AL1 sınıflarının tanımı
//abstract sinif ve boyutlu değiskenler alistirmasi
abstract class fx
{
abstract double f(double x);
}
public class H5AL1
{
public static double turev(fx fi,double x)
{
// bu metod birinci dereceden bir fonksiyonun t�revini hesaplar
// metodun hata miktari h0 and n degiskenlerinin degisimi ile
// degistirilebilir. fonksiyon girisi fx abstract s�n�f� �zerinden
// yapilmalidir.
// Bu problem boyutlu de§iskenerin kullan�lmasi ile ilgili de bir
// ornektir.
double h0=0.0256;
int i,m;
int n=7;
//basit bir fonksiyonun t�revi
double T[][];
T=new double[n][n];
double h[];
h=new double[n];
for(i=0;i<n;i++)
{
h[i]=0;
for(int j=0;j<n;j++)
T[i][j]=0;
}
h[0]=h0;
double r=0.5;
for( i=1;i<n;i++)
{
h[i]=h0*Math.pow(r,i);
}
for(i=0;i<n;i++)
{
T[i][0]=( fi.f(x + h[i]) - fi.f( x - h[i]))/(2.0*h[i]);
}
for(m=1;m<n;m++)
{
for(i=0;i<n-m;i++)
{
T[i][m]=(h[i]*h[i]*T[i+1][m-1] - h[i+m]*h[i+m]*T[i][m-1])/
(h[i]*h[i]- h[i+m]*h[i+m]);
}
}
double xx=T[0][n-1];
return xx;
}
public static double integral(fx fi,double a,double b)
{
//gauss-legendre denklemini kullanarak integral hesaplama
//
double s[],w[];
int i;
s=new double[30];
w=new double[30];
s[ 0] = .15532579626752470000E-02;
s[ 1] = .81659383601264120000E-02;
s[ 2] = .19989067515846230000E-01;
s[ 3] = .36899976285362850000E-01;
s[ 4] = .58719732103973630000E-01;
s[ 5] = .85217118808615820000E-01;
s[ 6] = .11611128394758690000E+00;
s[ 7] = .15107475260334210000E+00;
s[ 8] = .18973690850537860000E+00;
s[ 9] = .23168792592899010000E+00;
s[10] = .27648311523095540000E+00;
s[11] = .32364763723456090000E+00;
s[12] = .37268153691605510000E+00;
s[13] = .42306504319570830000E+00;
s[14] = .47426407872234120000E+00;
s[15] = .52573592127765890000E+00;
s[16] = .57693495680429170000E+00;
s[17] = .62731846308394490000E+00;
s[18] = .67635236276543910000E+00;
s[19] = .72351688476904450000E+00;
s[20] = .76831207407100990000E+00;
s[21] = .81026309149462140000E+00;
s[22] = .84892524739665800000E+00;
s[23] = .88388871605241310000E+00;
s[24] = .91478288119138420000E+00;
s[25] = .94128026789602640000E+00;
s[26] = .96310002371463720000E+00;
s[27] = .98001093248415370000E+00;
s[28] = .99183406163987350000E+00;
s[29] = .99844674203732480000E+00;
w[ 0] = .39840962480827790000E-02;
w[ 1] = .92332341555455000000E-02;
w[ 2] = .14392353941661670000E-01;
w[ 3] = .19399596284813530000E-01;
w[ 4] = .24201336415292590000E-01;
w[ 5] = .28746578108808720000E-01;
w[ 6] = .32987114941090080000E-01;
w[ 7] = .36877987368852570000E-01;
w[ 8] = .40377947614710090000E-01;
w[ 9] = .43449893600541500000E-01;
w[10] = .46061261118893050000E-01;
w[11] = .48184368587322120000E-01;
w[12] = .49796710293397640000E-01;
w[13] = .50881194874202750000E-01;
w[14] = .51426326446779420000E-01;
w[15] = .51426326446779420000E-01;
w[16] = .50881194874202750000E-01;
w[17] = .49796710293397640000E-01;
w[18] = .48184368587322120000E-01;
w[19] = .46061261118893050000E-01;
w[20] = .43449893600541500000E-01;
w[21] = .40377947614710090000E-01;
w[22] = .36877987368852570000E-01;
w[23] = .32987114941090080000E-01;
w[24] = .28746578108808720000E-01;
w[25] = .24201336415292590000E-01;
w[26] = .19399596284813530000E-01;
w[27] = .14392353941661670000E-01;
w[28] = .92332341555455000000E-02;
w[29] = .39840962480827790000E-02;
int n=30;
double z=0;
double x,y;
for(i=0;i<n;i++)
{
x=(b+a)/2.0+(b-a)/2.0*s[i];
y=fi.f(x);
z+=(b-a)/2*w[i]*y;
}
for(i=0;i<n;i++)
{
x=(b+a)/2.0+(b-a)/2.0*(-s[i]);
y=fi.f(x);
z+=(b-a)/2.0*w[i]*y;
}
return z;
}
}
4. H5AL2.java programı alıştırma 3 de verilen turev ve integral sınıflarını konsol ortamında kullanmaktadır. Programın inceleyiniz.
Program 5.8 H5AL2.java
import java.io.*;
import H5AL1;
class f1 extends fx
{
double f(double x)
{
return x*x;
}
}
class f2 extends fx
{
double f(double x)
{
return Math.sin(x);
}
}
public class H5AL2
{
public static void main(String args[]) throws IOException
{
f1 b1;
b1=new f1();
System.out.println("Integral : "+H5AL1.integral(b1,0.0,1.0));
System.out.println("Turev : "+H5AL1.turev(b1,1.0));
f2 b2;
b2=new f2();
System.out.println("Integral : "+H5AL1.integral(b2,0.0,Math.PI));
System.out.println("Turev : "+H5AL1.turev(b2,Math.PI));
}
}
5. H5O2 :
abstract class fxi
{
abstract double f(double x[]);
}
tanımını ve H5AL1 sınıfındaki turev metotuna H5O2 sınıfında
public static double turev(fx fi,double x)
gerekli değişiklikleri yaparak
public static double turev(fxi fi,double x[],int i)
metotunu oluşturunuz
ve i'inci x değeri için denklemin türevini hesaplayınız.
( dfi(x[])/dxi türevini hesaplayınız. )
Program 5.9 H5O2.java
//abstract sinif ve boyutlu değişkenler odevi
abstract class fxi
{
abstract double f(double x[]);
}
public class H5O2
{
public static double turev(fxi fi,double x[],int k)
{
// bu metot ninci dereceden bir fonksiyonun t�revini hesaplar
// metotun hata miktari h0 and n degiskenlerinin degisimi ile
// degistirilebilir. fonksiyon girisi fxi abstract s�n�f� �zerinden
// yapilmalidir.
// Bu problem boyutlu de§iskenerin kullan�lmasi ile ilgili de bir
// ornektir.
double h0=0.0256;
int i,m;
int n=7;
//basit bir fonksiyonun t�revi
double T[][];
T=new double[n][n];
double h[];
h=new double[n];
for(i=0;i<n;i++)
{
h[i]=0;
for(int j=0;j<n;j++)
T[i][j]=0;
}
h[0]=h0;
double r=0.5;
for( i=1;i<n;i++)
{
h[i]=h0*Math.pow(r,i);
}
for(i=0;i<n;i++)
{
double temp=x[k];
x[k]=x[k] + h[i];
double fiP=fi.f(x);
x[k]=temp - h[i];
double fiM=fi.f(x);
x[k]=temp;
T[i][0]=( fiP - fiM)/(2.0*h[i]);
}
for(m=1;m<n;m++)
{
for(i=0;i<n-m;i++)
{
T[i][m]=(h[i]*h[i]*T[i+1][m-1] - h[i+m]*h[i+m]*T[i][m-1])/
(h[i]*h[i]- h[i+m]*h[i+m]);
}
}
double xx=T[0][n-1];
return xx;
}
public static double integral(fxi fi,double x[],int k, double a,double b)
{
//gauss-legendre denklemini kullanarak integral hesaplama
//integral(x[k]=a dan x[k]=b ye kadar fonksiyon fi(x), x=x[0]..x[k]..x[n]
//
double s[],w[];
double tempxk=x[k];
int i;
s=new double[30];
w=new double[30];
s[ 0] = .15532579626752470000E-02;
s[ 1] = .81659383601264120000E-02;
s[ 2] = .19989067515846230000E-01;
s[ 3] = .36899976285362850000E-01;
s[ 4] = .58719732103973630000E-01;
s[ 5] = .85217118808615820000E-01;
s[ 6] = .11611128394758690000E+00;
s[ 7] = .15107475260334210000E+00;
s[ 8] = .18973690850537860000E+00;
s[ 9] = .23168792592899010000E+00;
s[10] = .27648311523095540000E+00;
s[11] = .32364763723456090000E+00;
s[12] = .37268153691605510000E+00;
s[13] = .42306504319570830000E+00;
s[14] = .47426407872234120000E+00;
s[15] = .52573592127765890000E+00;
s[16] = .57693495680429170000E+00;
s[17] = .62731846308394490000E+00;
s[18] = .67635236276543910000E+00;
s[19] = .72351688476904450000E+00;
s[20] = .76831207407100990000E+00;
s[21] = .81026309149462140000E+00;
s[22] = .84892524739665800000E+00;
s[23] = .88388871605241310000E+00;
s[24] = .91478288119138420000E+00;
s[25] = .94128026789602640000E+00;
s[26] = .96310002371463720000E+00;
s[27] = .98001093248415370000E+00;
s[28] = .99183406163987350000E+00;
s[29] = .99844674203732480000E+00;
w[ 0] = .39840962480827790000E-02;
w[ 1] = .92332341555455000000E-02;
w[ 2] = .14392353941661670000E-01;
w[ 3] = .19399596284813530000E-01;
w[ 4] = .24201336415292590000E-01;
w[ 5] = .28746578108808720000E-01;
w[ 6] = .32987114941090080000E-01;
w[ 7] = .36877987368852570000E-01;
w[ 8] = .40377947614710090000E-01;
w[ 9] = .43449893600541500000E-01;
w[10] = .46061261118893050000E-01;
w[11] = .48184368587322120000E-01;
w[12] = .49796710293397640000E-01;
w[13] = .50881194874202750000E-01;
w[14] = .51426326446779420000E-01;
w[15] = .51426326446779420000E-01;
w[16] = .50881194874202750000E-01;
w[17] = .49796710293397640000E-01;
w[18] = .48184368587322120000E-01;
w[19] = .46061261118893050000E-01;
w[20] = .43449893600541500000E-01;
w[21] = .40377947614710090000E-01;
w[22] = .36877987368852570000E-01;
w[23] = .32987114941090080000E-01;
w[24] = .28746578108808720000E-01;
w[25] = .24201336415292590000E-01;
w[26] = .19399596284813530000E-01;
w[27] = .14392353941661670000E-01;
w[28] = .92332341555455000000E-02;
w[29] = .39840962480827790000E-02;
int n=30;
double z=0;
double y;
for(i=0;i<n;i++)
{
x[k]=(b+a)/2.0+(b-a)/2.0*s[i];
y=fi.f(x);
z+=(b-a)/2*w[i]*y;
}
for(i=0;i<n;i++)
{
x[k]=(b+a)/2.0+(b-a)/2.0*(-s[i]);
y=fi.f(x);
z+=(b-a)/2.0*w[i]*y;
}
x[k]=tempxk;
return z;
}
}
6 . Program 5.10 da verilen polar sınıfını inceleyiniz. Polar sınıfının kompleks sınıfıyla oldukça benzer olduğunu gözlemleyebilirsiniz. Bu iki sınıfın temel özelliklerinden yararlanan abstact bir sınıf oluşturunuz, bu sınıfın alt sınıfları olarak polar ve kompleks sınıflarını yeniden tanımlayınız. Bir örnek programda abstract sınıf üzerinden polar ve kompleks sınıfları çağırarak kullanınız.
Program 5.10 Polar sınıfı tanımı Polar.java
public class polar
{
//duzlemde tanimlanmis polar koordinat sistemi
protected double R,teta;
public polar()
{
R=0;
teta=0;
}
public polar(double Ri,double tetai)
{
R=Ri;
teta=tetai;
}
public polar(polar y)
{
R=y.ROku();
teta=y.tetaOku();
}
public void RGir(double Ri)
{
R=Ri;
}
public void tetaGir(double tetai)
{
teta=tetai;
}
public void polarGir(double Ri,double tetai)
{
R=Ri;
teta=tetai;
}
public void kartesienGir(double xi,double xj)
{
R=Math.sqrt(xi*xi+xj*xj);
teta=Math.atan2(xj,xi);
}
public double ROku()
{
return R;
}
public double tetaOku()
{
return teta;
}
public double xi()
{
return R*Math.cos(teta);
}
public double xj()
{
return R*Math.sin(teta);
}
public void topla(polar y)
{
kartesienGir((xi()+y.xi()),(xj()+y.xj()));
}
public void fark(polar y)
{
kartesienGir((xi()-y.xi()),(xj()-y.xj()));
}
public polar polarOku()
{
return this;
}
public boolean esittir(polar v)
{
boolean b=((R==v.ROku())&&(teta==v.tetaOku()));
return b;
}
public boolean buyuktur(polar v)
{
return (this.R>v.ROku());
}
public boolean kucuktur(polar v)
{
return (this.R<v.ROku());
}
public String toString()
{
return ""+R+"*exp("+teta+"i) ";
}
}
<< index
< bölüm 4
> bölüm 6
bölüm başı