हाय! जावा मधील अमूर्त वर्गांबद्दल बोलूया .
वर्गांना "अमूर्त" का म्हणतात?
तुम्हाला कदाचित आठवत असेल की अॅब्स्ट्रॅक्शन म्हणजे काय — आम्ही याबद्दल आधी चर्चा केली होती :) तुम्ही विसरलात तर काळजी करू नका. लक्षात ठेवा, हे एक ओओपी तत्त्व आहे जे म्हणते, वर्ग डिझाइन करताना आणि ऑब्जेक्ट्स तयार करताना, तुम्ही केवळ घटकाचे मुख्य गुणधर्म दाखवले पाहिजे आणि दुय्यम ते टाकून द्यावे. उदाहरणार्थ, जर आपणSchoolTeacher
वर्गाची रचना करत असाल तर, उंची ही शिक्षकाची आवश्यक मालमत्ता असणार नाही. खरंच, हे वैशिष्ट्य शिक्षकासाठी महत्त्वाचे नाही. परंतु जर आपण BasketballPlayer
वर्ग तयार करत असाल, तर उंची ही सर्वात महत्त्वाची वैशिष्ट्ये असेल. बरं, एक अमूर्त वर्गभविष्यातील वर्गांच्या गटासाठी सर्वात अमूर्त, "उग्र वर्कपीस" आहे. वर्कपीस थेट वापरली जाऊ शकत नाही - ती खूप "उग्र" आहे. परंतु ते विशिष्ट वैशिष्ट्यपूर्ण स्थिती आणि वर्तन परिभाषित करते जे भविष्यातील वर्ग - अमूर्त वर्गाचे वंशज - असतील.
Java मधील अमूर्त वर्गांची उदाहरणे
कारसह एक साधे उदाहरण विचारात घ्या:
public abstract class Car {
private String model;
private String color;
private int maxSpeed;
public abstract void gas();
public abstract void brake();
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
सर्वात सोपा अॅबस्ट्रॅक्ट वर्ग हा असा दिसतो. जसे आपण पाहू शकता, विशेष काही नाही :) आम्हाला याची आवश्यकता का असू शकते? प्रथम, हे आपल्याला आवश्यक असलेल्या घटकाचे सर्वात अमूर्त वर्णन प्रदान करते - एक कार. अमूर्त कीवर्डचा अर्थ येथे काहीतरी आहे . वास्तविक जगात, "फक्त एक कार" असे काहीही नाही. ट्रक, रेस कार, सेडान, कूप आणि एसयूव्ही आहेत. आमचा अमूर्त वर्ग हा फक्त एक "ब्लूप्रिंट" आहे जो आम्ही नंतर विशिष्ट कार वर्ग तयार करण्यासाठी वापरू.
public class Sedan extends Car {
@Override
public void gas() {
System.out.println("The sedan is accelerating!");
}
@Override
public void brake() {
System.out.println("The sedan is slowing down!");
}
}
बर्याच मार्गांनी, हे आपण वारसासंबंधीच्या धड्यांबद्दल बोललो त्यासारखेच आहे. फक्त त्या बाबतीत आमच्याकडे एक Car
वर्ग होता ज्यांच्या पद्धती अमूर्त नव्हत्या. परंतु अशा सोल्यूशनचे अनेक तोटे आहेत जे अमूर्त वर्गांमध्ये निश्चित केले आहेत. प्रथम आणि सर्वात महत्त्वाचे म्हणजे, अमूर्त वर्गाचे उदाहरण तयार केले जाऊ शकत नाही:
public class Main {
public static void main(String[] args) {
Car car = new Car(); // Error! The Car class is abstract!
}
}
Java च्या निर्मात्याने हे "वैशिष्ट्य" हेतुपुरस्सर केले आहे. पुन्हा एकदा, लक्षात ठेवा: अमूर्त वर्ग हा भविष्यातील "नियमित" वर्गांसाठी फक्त एक ब्लूप्रिंट आहे . तुम्हाला ब्लूप्रिंटच्या प्रतींची गरज नाही, बरोबर? त्याचप्रमाणे, अमूर्त वर्गाची उदाहरणे तयार करण्याची आवश्यकता नाही :) आणि जर Car
वर्ग अमूर्त नसता, तर आपण त्याची उदाहरणे सहजपणे तयार करू शकतो:
public class Car {
private String model;
private String color;
private int maxSpeed;
public void go() {
// ...some logic
}
public void brake() {
// ...some logic
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car(); // This is okay. The car is created.
}
}
सध्या, आमच्या कार्यक्रमात एक प्रकारची अनाकलनीय कार आहे. हा ट्रक नाही, रेस कार नाही आणि सेडान नाही, पण ते काय आहे हे खरोखर स्पष्ट नाही. ही "फक्त एक कार" आहे जी प्रत्यक्षात अस्तित्वात नाही. हेच उदाहरण प्राण्यांच्या बाबतीतही देता येईल. तुमच्या प्रोग्राममध्ये Animal
वस्तू (" फक्त प्राणी ") असतील तर कल्पना करा. तो कोणत्या प्रकारचा आहे, तो कोणत्या कुटुंबाचा आहे किंवा त्याची कोणती वैशिष्ट्ये आहेत हे स्पष्ट नाही. एखाद्या कार्यक्रमात पाहणे विचित्र असेल. निसर्गात "फक्त प्राणी" नाहीत. फक्त कुत्रे, मांजर, कोल्हे, मोल इ. अमूर्त वर्ग आपल्याला " फक्त वस्तू " पासून वाचवतात. ते आम्हाला आधारभूत स्थिती आणि वर्तन देतात. उदाहरणार्थ, सर्व कारचे मॉडेल , रंग आणि उच्च गती असणे आवश्यक आहे, आणि ते गॅस आणि ब्रेक लागू करण्यास सक्षम असले पाहिजेत . बस एवढेच. ही एक सामान्य अमूर्त ब्लूप्रिंट आहे जी तुम्ही नंतर तुम्हाला आवश्यक असलेल्या वर्गांची रचना करण्यासाठी वापराल. टीप: अमूर्त वर्गातील दोन पद्धती देखील अमूर्त आहेत , ज्याचा अर्थ त्यांची कोणतीही अंमलबजावणी नाही. कारण एकच आहे: अमूर्त वर्ग "फक्त कार" साठी "डिफॉल्ट वर्तन" तयार करत नाहीत. ते फक्त सूचित करतात की प्रत्येक कार काय करण्यास सक्षम असणे आवश्यक आहे. ते म्हणाले, जर तुम्हाला डीफॉल्ट वर्तनाची आवश्यकता असेल, तर तुम्ही अमूर्त वर्गात पद्धती लागू करू शकता. Java हे मनाई करत नाही:
public abstract class Car {
private String model;
private String color;
private int maxSpeed;
public void gas() {
System.out.println("Accelerating!");
}
public abstract void brake();
// Getters and setters
}
public class Sedan extends Car {
@Override
public void brake() {
System.out.println("The sedan is slowing down!");
}
}
public class Main {
public static void main(String[] args) {
Sedan sedan = new Sedan();
sedan.gas();
}
}
कन्सोल आउटपुट:
Accelerating!
तुम्ही बघू शकता, आम्ही अमूर्त वर्गात एक पद्धत लागू केली, परंतु दुसरी नाही. परिणामी, आमच्या Sedan
वर्गाचे वर्तन दोन भागात विभागले गेले आहे: जर आपण त्याची gas()
पद्धत म्हटले तर, वर्तन अमूर्त Car
पालक वर्गातून "पुल अप" केले जाते आणि आम्ही brake()
वर्गात पद्धत लागू करतो Sedan
. ते अतिशय सोयीस्कर आणि लवचिक आहे. पण आमचा वर्ग आता इतका अॅबस्ट्रॅक्ट नाही आहे का ? अखेर, प्रत्यक्षात अर्ध्या पद्धती लागू केल्या. वस्तुस्थिती अशी आहे - आणि हे एक अतिशय महत्वाचे वैशिष्ट्य आहे - जर वर्ग त्याच्या पद्धतींपैकी एकही अमूर्त असेल तर तो अमूर्त असतो.. दोनपैकी एक पद्धत, किंवा हजारांपैकी एक - काही फरक पडत नाही. आम्ही एकही गोषवारा न ठेवता सर्व पद्धती अंमलात आणू शकतो. परिणाम कोणत्याही अमूर्त पद्धतींशिवाय एक अमूर्त वर्ग असेल. हे तत्त्वतः शक्य आहे — कंपायलर कोणत्याही त्रुटी निर्माण करणार नाही — परंतु असे न करणे चांगले आहे, कारण ते अमूर्त शब्दाचा अर्थ हिरावून घेतो. हे पाहून तुमचे सहकारी प्रोग्रामर देखील आश्चर्यचकित होतील :/ ते म्हणाले, जर एखादी पद्धत अमूर्त म्हणून चिन्हांकित केली असेल, तर प्रत्येक वंशज वर्गाने ती लागू केली पाहिजे किंवा अमूर्त म्हणून घोषित केली पाहिजे. अन्यथा, कंपाइलर एक त्रुटी टाकेल. अर्थात, प्रत्येक वर्ग फक्त एक अमूर्त वर्ग वारसा मिळवू शकतो, म्हणून वारशाच्या बाबतीत अमूर्त आणि नियमित वर्गांमध्ये फरक नाही. आम्हाला अमूर्त वर्ग किंवा नियमित वर्ग वारसा मिळाला तर काही फरक पडत नाही — फक्त एक पालक वर्ग असू शकतो.
Java मध्ये एकाधिक वर्ग वारसा का नाही
आम्ही आधीच सांगितले आहे की जावामध्ये एकापेक्षा जास्त वारसा नाही, परंतु आम्ही खरोखर का शोधले नाही. आता ते करण्याचा प्रयत्न करूया. वस्तुस्थिती अशी आहे की जर Java कडे एकाधिक वारसा असेल, तर बाल वर्ग कोणते वर्तन निवडायचे हे ठरवू शकणार नाहीत. समजा आमच्याकडे दोन वर्ग आहेत:Toaster
आणि NuclearBomb
:
public class Toaster {
public void on() {
System.out.println("The toaster is on. We're toasting!");
}
public void off() {
System.out.println("The toaster is off!");
}
}
public class NuclearBomb {
public void on() {
System.out.println("Boom!");
}
}
तुम्ही बघू शकता, दोन्ही वर्गांची एक on()
पद्धत आहे. टोस्टरसाठी, पद्धत टोस्ट बनवण्यास प्रारंभ करते, परंतु अणुबॉम्बच्या बाबतीत, तो स्फोट घडवून आणतो. उह-ओह :/ आता कल्पना करा की तुम्ही ठरवले आहे (मला का विचारू नका!) मध्ये काहीतरी तयार करायचे. हा तुमचा वर्ग आहे: MysteriousDevice
! हा कोड नक्कीच काम करणार नाही. आम्ही ते फक्त "काय झाले असेल" चे उदाहरण म्हणून सादर करतो:
public class MysteriousDevice extends Toster, NuclearBomb {
public static void main(String[] args) {
MysteriousDevice mysteriousDevice = new MysteriousDevice();
mysteriousDevice.on(); // And what should happen here? Will we get toast or a nuclear apocalypse?
}
}
आम्हाला काय मिळाले ते पाहूया. रहस्यमय यंत्र एकाच वेळी टोस्टर आणि न्यूक्लियरबॉम्ब या दोन्हींमधून प्राप्त होते. दोघांची एक on()
पद्धत आहे. परिणामी, आपण on()
एखाद्या MysteriousDevice
ऑब्जेक्टवर कॉल केल्यास कोणती अंमलबजावणी कार्यान्वित करावी हे स्पष्ट नाही. वस्तू समजणार नाही. आणि हे सर्व बंद करण्यासाठी, NuclearBomb कडे पद्धत नाही off()
, म्हणून जर आपण अचूक अंदाज लावला नाही, तर डिव्हाइस बंद करणे अशक्य होईल. हे "गैरसमज", जेव्हा हे स्पष्ट नसते की कोणती वर्तणूक अंमलात आणावी, Java च्या निर्मात्यांनी एकाधिक वारसा नाकारण्याचे नेमके कारण आहे. ते म्हणाले, तुम्ही शिकाल की Java वर्ग अनेक इंटरफेस लागू करू शकतात.
GO TO FULL VERSION