İstanbul Üniversitesi Bilgisayar Mühendisliği Bölümü Nesne Yönelimli Programlama Dersi Vize Soruları ve Çözümleri
1. Aşağıdaki sorulara birer cümle ile cevap veriniz. (Sorular tanım sorusu değildir, sorulardaki terimleri tanımlamayınız , sadece sorularda açıklanması istenen açılardan cevap verinizi( farkı veya ilişkisi gibi)) (20 puan)
a. Nesne (Object) ve Sınıf (Class) arasındaki ilişkiyi açıklayınız.
Sınıf, nesnelerin tanımının yapıldığı (özellik ve metotlarının yazıldığı) yerdir. Nesneler sınıfların yaşayan, RAM’de yer kaplayan halleridir.
b. Soyut sınıf (abstract class) ile arayüz (interface) arasındaki farkı açıklayınız.
Soyut sınıfı miras alan (inheritance) sınıflar, ya soyut kalır ya da soyut metotların üzerine bindirme (overriding) yapmak zorundadır. Aynı durum bir arayüzü (interface) import eden sınıf için de geçerlidir ancak sınıfın soyut mutlaka ve mutlaka ilgili metodu kodlamak zorundadır. Soyut bırakmak gibi bir imkanı yoktur.
c. Soyut metot (abstract method) ile nihai metot (final method) arasındaki farkı açıklayınız.
Soyut metot, miras ilişkisinde (inheritance) ya üzerine yüklenir ya da miras alan sınıfı da soyut yapar. Nihai metot (final method) ise kesinlikle üzerine yüklenemez.
d. Bir sınıfın (class), başka bir sınıfı miras alması (inheritance) ile bir arayüzü (interface) uygulaması (implements) arasındaki farklar nelerdir?
Uygulamada özellikler aktarılmaz. Buna karşılık uygulanmış arayüzler, kesinlikle ilgili metotların kodlandığını garanti eder.
e. Normal bir metot ile inşa metodu (constructor method) arasındaki 4 farkı yazınız.
İnşa metodu, sınıf ile aynı isimdedir (1), public olmalıdır (2), geri değer döndüremez (3), bir sınıftan ilk kez nesne üretilirken otomatik olarak çalıştırılır (4), geri dönüş tipi yoktur (5), inşa metodu sadece bir kere çalışır bundan sonra tekrar çağrılamaz (6).
2. Boğaz köprülerinden geçiş yapan araçlardaki OGS cihazlarının yazılımını yazmanız isteniyor. Buna göre araçların OGS kayıtlarının tutulması sırasında bir OGS numarası, sahibinin ismi ve soy ismi, aracın sınıfı (1. Sınıf: otomobil, 2. Sınıf: minibüs, 3. Sınıf: otobüs), geçiş yaptığı tarih ve saat bilgileri, bakiyesi gibi bilgileri tutacak ve aşağıdaki istenenleri karşılayacaksınız (60 puan).
a. Nesne yönelimli tasarımı Java dilinde kodlayınız. Tasarımınız sırasında her araç sınıfı için ayrı bir sınıf (class) tanımı yapınız.
b. Tasarımınıza, ödeme kabul eden fonksiyonu olan bir gişe sınıfı ekleyiniz. Bu fonksiyon, bütün araç sınıflarını kabul eden ve ilgili araç sınıfına göre bakiyeyi azaltan tek bir fonksiyon olsun.
c. OGS yönetimi için raporlama yapmanız isteniyor. Gişe sınıfının, günlük olarak geçen araçları bir dizide (array) tutmasını sağlayınız. Yönetim için yeni bir sınıf yazıp, istenildiğinde elde edilen toplam günlük bakiyeyi ekrana basan bir fonksiyon kodlayınız.
d. Araçların OGS kullanabilmesi için mutlaka OGS cihazının bulunmasını sağlayan nesne yönelimli tasarımı yapınız. Şayet OGS cihazı bulunmayan bir araç, gişelerden geçmeye çalışırsa, nesne yönelimli olarak hata veriniz.
interface OGSBulundurur{
int odeme();
}
abstract class OGSvasita implements OGSBulundurur{
int bakiye ;
int ucret;
public int odeme(){
bakiye -= ucret;
return bakiye;
}
}
class otomobil extends OGSvasita{
public otomobil(){
ucret = 3 ;
}
}
class minibus extends OGSvasita{
public minibus(){
ucret = 4 ;
}
}
class otobus extends OGSvasita{
public otobus(){
ucret = 5 ;
}
}
class gise{
OGSBulundurur liste[];
int i ;
public gise(){
liste = new OGSBulundurur[ 20 ];
i= 0 ;
}
void odemeAl(OGSBulundurur v){
liste[i++] = v;
v.odeme();
}
}
class yonetim{
public void raporla(gise g){
int toplam = 0 ;
for ( int i = 0 ;i<g.i;i++){
System.out.println(((OGSvasita)g.liste[i]).ucret);
toplam += (((OGSvasita)g.liste[i]).ucret);
}
System.out.println( “—– n Toplam : “ + toplam);
}
}
public class testogs{
public static void main(String args[]){
otobus o = new otobus();
o.bakiye = 100 ;
gise g = new gise();
g.odemeAl(o);
otomobil oto = new otomobil();
oto.bakiye = 70 ;
g.odemeAl(oto);
g.odemeAl(o);
yonetim y = new yonetim();
y.raporla(g);
}
}
3. Aşağıdaki kodun ekran çıktısını yazınız (20 puan):
interface x{
int a = 9 ;
}
interface y extends x{
int a = 10 ;
int g();
}
class ust implements x{
int a = 5 ;
public int g(){
return a;
}
}
class deneme extends ust implements y{
public deneme(){
this .a = super .a;
}
int a = 4 ;
public int g(){
return a;
}
public int g( int a){
return super .a;
}
}
public class inter{
public static void main(String args[]){
ust d = new deneme();
System.out.println(d.g());
}
}
Deneme tipindeki d nesnesinin g() fonksiyonu çağrılmıştır. Bu fonksiyon a değişkenini döndürmektedir. Her ne kadar deneme sınıfındaki yegane tanımlı a değişkeninin değeri 4 olsa da bu sınıfın inşa fonksiyonunda (constructor) değer olarak süper.a değeri atanmıştır. Buna göre miras alınan (inheritance) sınıfın değeri kopyalanacaktır. Miras alınan sınıfta ise (ust class) a değişkeninin değeri 5 olarak tanımlanmıştır. Bu durumda deneme sınıfından türetilen nesnenin a değişkeni de 5 olacaktır (aslında 4 olan değerin üzerine 5 değeri konulacaktır) dolayısıyla ekrana 5 çıktısı verilecektir.
Interface olarak tanımlanan ve uygulanan (implements) yapılar ile kodun bir ilgisi yoktur. Buradaki a değişkenleri zaten sınıf tarafından kullanılmamaktadır.
Keşke biz bu soruların olduğu döneme denk gelseydik 🙂