ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 3 · 2లో పాఠం 2కోర్సులో 6/14~15 min
మాడ్యూల్ పాఠాలు (2/2)

పాలిమార్ఫిజం మరియు వియుక్త తరగతులు

పాలీమార్ఫిజం మరియు నైరూప్య తరగతులు అధునాతన ఆబ్జెక్ట్-ఓరియెంటెడ్ ప్రోగ్రామింగ్ కాన్సెప్ట్‌లు, ఇవి నిర్దిష్ట అమలుల నుండి స్వతంత్రంగా సౌకర్యవంతమైన, ఎక్స్‌టెన్సిబుల్ కోడ్‌ను వ్రాయడానికి అనుమతిస్తాయి.

బహురూపత

పాలిమార్ఫిజం (అనేక రూపాలు) అనే పదం వివిధ తరగతుల వస్తువులను సాధారణ రకానికి చెందినదిగా భావించే సామర్థ్యాన్ని సూచిస్తుంది. జావాలో, సూపర్‌క్లాస్ రిఫరెన్స్ వేరియబుల్ దాని సబ్‌క్లాస్‌లలో ఏదైనా ఒక వస్తువుకు సూచనను నిల్వ చేయగలదు.

Java
class Animal {
    public void makeSound() {
        System.out.println("Verso...");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("Woof");
    }
}

class Cat extends Animal {
    public void makeSound() {
        System.out.println("Miao");
    }
}

పాలిమార్ఫిజమ్‌కు ధన్యవాదాలు, మేము దీన్ని చేయవచ్చు:

Java
Animal myAnimal1 = new Dog(); // Polymorphism
Animal myAnimal2 = new Cat(); // Polymorphism

myAnimal1.makeSound(); // Executes Dog's method (Woof)
myAnimal2.makeSound(); // Executes Cat's method (Miao)

రిఫరెన్స్ వేరియబుల్ రకం కాకుండా వాస్తవ వస్తువు ఆధారంగా రన్‌టైమ్‌లో (లేట్ బైండింగ్ లేదా డైనమిక్ డిస్‌పాచ్) ఏ పద్ధతిని ప్రారంభించాలనే నిర్ణయం తీసుకోబడుతుంది.

వియుక్త తరగతులు (abstract)

అబ్‌స్ట్రాక్ట్ క్లాస్ అనేది abstract కీవర్డ్‌తో మార్క్ చేయబడిన క్లాస్, ఇది నేరుగా ఇన్‌స్టాంటియేట్ చేయబడదు (మీరు new MyAbstractClass() చేయలేరు). ఇది ఇతర తరగతులకు "పాక్షిక టెంప్లేట్" వలె పనిచేస్తుంది.

వియుక్త పద్ధతులు

ఒక అబ్‌స్ట్రాక్ట్ క్లాస్‌లో అబ్‌స్ట్రాక్ట్ మెథడ్స్ ఉండవచ్చు: బాడీ లేకుండా డిక్లేర్డ్ చేయబడిన పద్ధతులు (వంకర జంట కలుపులు మరియు కోడ్ లేవు), సెమికోలన్‌తో ముగుస్తుంది. వారసత్వంగా వచ్చిన అన్ని వియుక్త పద్ధతులను అమలు చేయడానికి నాన్-అబ్‌స్ట్రాక్ట్ సబ్‌క్లాస్‌లు అవసరం.

Java
abstract class Shape {
    String color;

    // Abstract method (no body)
    public abstract double getArea();
}

class Circle extends Shape {
    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // Required to implement getArea
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

డైనమిక్ బైండింగ్ / లేట్ బైండింగ్

రన్‌టైమ్‌లో ఏ పద్ధతిని అమలు చేయాలో జావాకు ఎలా తెలుసు? ఈ ప్రక్రియను లేట్ బైండింగ్ (లేదా డైనమిక్ బైండింగ్) అంటారు. ఓవర్‌లోడింగ్ కాకుండా (ఇది కంపైల్ సమయంలో పరిష్కరించబడుతుంది), కంపైలర్‌కు ఏ నిర్దిష్ట పద్ధతి అమలు చేయబడుతుందో తెలియదు. బదులుగా, ఇది సాధారణ కాల్ సూచనను రూపొందిస్తుంది. రన్‌టైమ్‌లో, జావా వర్చువల్ మెషిన్ (JVM) మెమరీలోని వాస్తవ వస్తువును తనిఖీ చేస్తుంది మరియు ఆ వస్తువు యొక్క తరగతిలో నిర్వచించిన పద్ధతి అమలును ప్రేరేపిస్తుంది.

వియుక్త తరగతులు మరియు తప్పిపోయిన అమలు

ఒక ఉపవర్గం వియుక్త తరగతి నుండి వారసత్వంగా పొందినట్లయితే, దానికి రెండు ఎంపికలు ఉన్నాయి:

  1. అన్ని నైరూప్య పద్ధతులను అమలు చేయండి: ఈ సందర్భంలో, సబ్‌క్లాస్ సాధారణ (కాంక్రీట్) తరగతిగా ఉంటుంది మరియు తక్షణం చేయవచ్చు.
  2. తానే వియుక్తంగా ప్రకటించుకోండి: సబ్‌క్లాస్ అన్ని సంక్రమిత నైరూప్య పద్ధతులకు అమలును అందించకపోతే, అది abstract కీవర్డ్‌తో కూడా ప్రకటించబడాలి.
Java
abstract class Animal {
    public abstract void makeSound();
}

// This class MUST be abstract because it does not implement makeSound()
abstract class Canine extends Animal {
    // Inherits makeSound() but does not implement it
}

మీరే ప్రయత్నించండి

వ్యాయామం#java.m3.l2.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ఆకారపు చరరాశిని ప్రకటించండి మరియు పాలిమార్ఫిజం ఉపయోగించి దానికి కొత్త సర్కిల్ వస్తువును కేటాయించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

మూల రకాన్ని సూచన రకంగా ఉపయోగించడానికి `ఆకారం s = కొత్త సర్కిల్();` అని వ్రాయండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#java.m3.l2.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

షేప్ క్లాస్‌ని అబ్‌స్ట్రాక్ట్ చేసి, నైరూప్య పద్ధతిని డబుల్ getArea() జోడించండి. ఆపై స్క్వేర్‌ను పూర్తి చేయండి, తద్వారా అది ఆకారాన్ని విస్తరించి, getArea() తిరిగి వచ్చే వైపు * వైపును అమలు చేస్తుంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

ఆకృతిలో `పబ్లిక్ అబ్‌స్ట్రాక్ట్ డబుల్ గెట్ ఏరియా();`ని ప్రకటించండి. స్క్వేర్‌లో, `@ఓవర్‌రైడ్ పబ్లిక్ డబుల్ getArea() {తిరిగి వైపు * వైపు; }`.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#java.m3.l2.e3
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ప్రధాన పద్ధతిలో 2.0 వ్యాసార్థంతో సర్కిల్ ఆబ్జెక్ట్ మరియు 3.0 వైపు ఉన్న స్క్వేర్ ఆబ్జెక్ట్‌ను కలిగి ఉన్న రకం ఆకారం[] యొక్క శ్రేణిని ప్రకటించండి. ఆపై, getArea() పద్ధతిని ప్రారంభించడం ద్వారా ప్రతి ఆకారం యొక్క ప్రాంతాన్ని ముద్రించడానికి లూప్ (ప్రతి కోసం లేదా ప్రతి కోసం) ఉపయోగించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

`ఆకారం[] ఆకారాలు = {కొత్త సర్కిల్(2.0), కొత్త స్క్వేర్(3.0) };`తో శ్రేణిని ప్రకటించండి మరియు `s.getArea()` కోసం ప్రింటింగ్‌ని ఉపయోగించి దాని ద్వారా లూప్ చేయండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది