A
B
C
Ç
D
E
F
G
Ğ
H
I
İ
J
K
L
M
N
O
P
R
S
Ş
T
U
Ü
V
Y
Z
Q
W
X
+ Ekle
Interface’ler ve Abstract Class’lar

Interface’ler ve Abstract Class’lar
Interface Kavramı

Java"da interface, bir class"ta olması gereken method ve property"leri tanımlayan yapıdır. Kendisi normal bir class değildir, sadece neyin yapılacağını göstermekte, ancak nasıl yapılacağını göstermemektedir. Örnek olarak, bir madde"de ne gibi işlevler ve özellikler olması gerektiğini belirten bir interface yazalım.

Matter.java

public interface Matter{
2 public double getVolume();
3 public double getMass();
4 }

Bu ifade, "bir maddenin yoğunluğu, hacmi ve kütlesi olur" demenin
Java"daki yoludur. Ancak görüldüğü gibi maddenin yoğunluğu nasıl
hesaplanır, kütlesi nasıl verilir, hiç bir şekilde belirtmemektedir.

Interface"in Implementation"u

Bir class"ın interface"deki bütün method"ları içerdiğini, gerçekleştirdiğini belirtmesine implementation denir ve "implements" keyword"üyle kullanılır.

CubeMatter.java :

public class CubeMatter implements Matter{
2 public double density=1.0;



3 public double edge=1.0;
4 public double getDensity(){
5 return density;
6 }
7 public double getVolume(){
8 return edge*edge*edge;
9 }
10 public double getMass(){
11 return density*edge*edge*edge;
12 }
13 }
Burada "Küp diye bir nesnemiz var ve o bir maddedir, yani bir maddede
olabilecek bütün nitelikler onda da bulunur." demiş olduk ve bunların
nasıl hesaplandığını gösterdik. Aynı interface"i implement eden başka bir class"da yapılabilir. Sadece ne olması gerktiğini söylemektedir.

SphereMatter.java:

public class SphereMatter implements Matter{
2 public double density=1.0;
3 public double radius=1.0;
4 public double getDensity(){
5 return density;
6 }
7 public double getVolume(){
8 return (3.14 * radius * radius * radius )/3;
9 }
10 public double getMass(){
11 return density*(3.14 * radius * radius * radius )/3;
12 }
13 }

Görüldüğü gib bu class"da aynı interface implement ediyor. Ancak hacim ve kütle hesaplaması çok değişik.

Absract Class"lar

Bazı methodlarını implement etmiş, bazılarının imlementation"unun kendisini extend eden class"a bırakmış olan class"a abstract class denir. Bu tip class"lar en çok, iki class"ın ortak methodlarından bazılarının implementation"u da aynı olması durumunda kullanılır. Örneğin bir küp için de kütle, hacim ve yoğunluğun çarpımına eşittir, bir küre için de. Ancak yaptığımız iki nesnede de bu ortak özelliği kullanamıyor. Her birisi kütle hesaplamasını kendisi yapılıyor. Matter interface"ini implement eden ne kadar class varsa bu işlem o kadar tekrarlanacak demektir. Bu "ortak" işlemi bir kere yapıp, hep onun kullanılmasını sağlamak mümkündür.

Ancak çözülmesi gereken bir sorun var : Her class"ın kütlesi aynı şekilde hesaplanıyor bunu hesaplamak için gerekli hacim değerini bilmiyoruz ve her class kendisine göre değişik bir şeklide hesaplıyor. Bu sorun abstract method kullanarak çözülebilir.

Body.java :

abstract public class Body{
2 public double density=1.0;
3 public Body(double d){
4 density=d;
5 }
6 public double getDensity(){
7 return density;
8 }
9 public double getMass(){
10 return density*getVolume();
11 }
12 abstract public double getVolume();
13 }

Burada abstract bir Body class"ı yarattık. Bu class, hem Cube"ün hem de
Sphere"in ortak özelliklerini içermektedir. Zaten density property"si
ikisinde de ortaktır. Bu şekilde inherintace yoluyla Cube ve Sphere"a
geçebilir. Burada getVolume() method"u abstract bırakılmıştır. Yani
implement edilmemiştir. Çünkü volume hesaplamak için her nesne farklı
bir method kullanmaktadır. Ancak getMass() implement edilmiştir. Çünkü
kütle yoğunlukla hacmin çarpımıdır. Burada object-oriented porgramlama
dışındaki bir teknikle asla yapılamayacak bir işlem bulunmaktadır. Bir
method (getMass()) henüz yazılmamış bir mehodu (getVolume()"u)
kullanarak bir işlem yapabilmektedir. Bu şekilde her cisim için ayrı
ayrı hesap yapmaktan kurtulmuş olduk. Şimdi küp ve küre için yeni
class"lar yapalım :
CubeBody.java:

public class CubeBody extends Body{
2 public double edge=1.0;
3 public CubeBody(double d,double e){
4 super(d);
5 edge=e;
6 }
7 public double getVolume(){
8 return edge*edge*edge;
9 }
10 }

Görüldüğü gibi bu class kütle hesabını yapan getMass() diye bir
method"u yazmak zorunda kalmadı. Çünkü ona miras yoluyla sahip
olmuştur. Aşağıdaki gibi kod yazılabilir :


CubeBody cube=new CubeBody(2.5,10.2);
double mass=cube.getMass();
System.out.println("Mass : "+mass);

Aynı şekilde yeni bir küre class"ı yazalım.

SphereBody.java:
public class SphereBody extends Body{
2 public double radius=1.0;
3 public SphereBody(double d,double r){
4 super(d);
5 radius=r;
6 }
7 public double getVolume(){
8 return (3.14 * radius * radius * radius )/3;
9 }
10 }

Tıpkı küp gibi küre de artık kütle hesabını, hiç bir ek kodlama yapmadan yapabilmektedir.

Hem Extend Hem Implement Etmek

Bir class sadece bir class"ı extend edebilir. Ancak aynı anda bir class"ı extend edip bir veya daha fazla interface"i implement edebilir. Çünkü "extends" keywordünün aksine, "implements" demek yoluyla bir class"ın aldığı hiç bir şey yoktur. Sadece bazı method"ları implement etmeyi taahüt etmektedir. Bir Cube class"ı hem Body classını extend edebilir hem de Matter inetrface"ni implement edebilir.

public class Cube extends Body implements Matter{
// ...

}

Base class"ın bir interface"i imlement etmesi durumda subclass"da etmiş sayılır. Yani
public class Body implements Matter{
// ...
}

dersek

public class Cube extends Body{
// ...
}

dememiz yeterlidir. Cube class"ı Matter"i implement etmiş sayılır. Yani implementation"u da miras yoluyla almış demektir.


Interface"in Kullanım Özellikleri

Interface"ler bütün methodları absract olan bir absract class gibi düşünülebilirler. Ancak class"lardan ayrılan başka özellikleri vardır. Ayrıca söylensin veya söylenmesin bütün method ve property"ler public sayılır ve başların proteced veya private gibi anahtar sözcükler alamazlar. Interface"lerde bütün propertyler public, final ve static"tir. O yüzden interface"lerde tanımlanan property"ler bir veya daha fazla class"da kullanılan sabitler için kullanılır.

MathConstants.java :

public interface MathConstants{
2 double PI=3.14;
3 }

Circle.java

public class Circle implements MathConstants{
2 private double radius=1.0;
3 public getCircumference(){
4 return 2*PI*radius;
5 }
6 }

görüldüğü Circle classında tanımlanmadığı halde PI değişkeni, sadece
MathConstants interface"ini implement ettiği için erişilebilir
durumdadır. Bu interface"i implement eden Cylinder adlı bir class"da
aynı şekilde PI"a erişebilir. Bu anlamda PI bir sabittir. Ama PI
property"si sadece implement edilen class"lar tarafından görülmekte
olduğundan global değildir. Zaten Java"da global değişken ve sabit
yoktur. Onlara ihtiyaç duyulan yerlerde interface kullanılır. Ancak
yine de değişken (dah doğrusu sabit) bir yere (interface) ait
olduğundan global olmasından doğacak sakıncalardan kurtulunabilir.
Örneğin Math.PI ve GreekLetters.PI yazılabilir, ikisi farklı değerler
taşıyabilir.






  Ad Soyad
  Yorum