/ / बहुरूपता ही एकमात्र समाधान है - बहुरूपता

पॉलिमॉर्फिज्म एकमात्र समाधान है - बहुरूपता

शीर्षक यह सब कहता है।

मुझे ऐसे परिदृश्य की आवश्यकता है जहां बहुरूपता ही एकमात्र समाधान हो। मैंने बहुरूपता के लाभों के साथ कई सूत्र देखे हैं, लेकिन मुझे लगता है, परिदृश्य जहां केवल बहुरूपता के साथ समाधान गायब है।

एक ही सवाल पूछने का दूसरा तरीका है:

"बहुरूपता की उत्पत्ति क्या है?"

उत्तर:

जवाब के लिए 0 № 1

आपका प्रश्न किसी तरह व्याख्या के लिए खुला है।

मुझे पहले अपने प्रश्न का उत्तर देने की कोशिश करें:

  1. एक सार अवधारणा के रूप में बहुरूपता
  2. C ++, Java, C #, आदि जैसी प्रोग्रामिंग भाषाओं और कंपाइलरों द्वारा सीधे पॉलीमॉर्फिज़्म का समर्थन किया जाता है

बहुरूपता के लिए डिफ़ॉल्ट उदाहरण एक हो सकता हैवेक्टर ग्राफिक्स टूल जैसे उदा। कोरल ड्रा, इंकस्केप। मान लें कि आप चाहते हैं कि उपयोगकर्ता एक कैनवास पर कई अलग-अलग भौगोलिक आकृतियों (वर्ग, त्रिकोण, सर्कल) को आकर्षित करने में सक्षम हो।

अब मेरा सुझाव है कि बहुरूपता की अवधारणा हैउस समस्या का एकमात्र समाधान, जबकि निश्चित रूप से एक ही समय में आप किसी भी प्रोग्रामिंग भाषा में एक समाधान लिखने में सक्षम होंगे, जिसमें एक अभिन्न बहुरूपता तंत्र (जैसे सी। सी) की पेशकश नहीं करना शामिल है।

स्पष्ट बहुरूपता कई "अगर" स्थितियों के रूप में स्पष्ट हो जाएगा।

इसलिए: बहुरूपता की अवधारणा हमेशा एकमात्र समाधान है, यदि:

  1. आपके पास ऐसी कई संस्थाएं हैं जो सामान्य व्यवहार का सबसेट साझा करती हैं, लेकिन प्रत्येक वर्ग के लिए कुछ विशेष व्यवहार भी हैं
  2. संकलन के समय आप यह नहीं जानते हैं कि केवल रनटाइम के दौरान किस ठोस वर्ग की आवश्यकता होगी

"मूल" के बारे में सवाल पर आपका ऐडबहुरूपता। बहुरूपता की अवधारणा कुछ प्रख्यात है, जैसे प्राइम्स, कम से कम मुझे ऐसा लगता है। 90 के दशक की शुरुआत में, कोरल ड्रॉ और वर्ड जैसे शुरुआती WYSWG प्रोग्रामों में C ++ के साथ प्रोग्रामिंग भाषाओं में पॉलीमोर्फिज़्म का निहित समर्थन शुरू हो गया किताब (यह निश्चित रूप से एक व्यक्तिगत अवलोकन है)

एक उदाहरण के नीचे।

// example WITH implicit polymorphism
abstract class PolyGeometricEntity
{
public int center_x__mm;                    // commen superset
public int center_y__mm;                    // commen superset
public void move(int d_x__mm, int d_y_mm)   // commen superset
{
center_x__mm += d_x__mm;
center_y__mm += d_y_mm:
}

public abstract int area();                 // commen superset on abstract level, but specialized at implementation level
public abstract void draw();               // commen superset on abstract level, but specialized at implementation level
}

class CircleEntity : PolyGeometricEntity
{
public override int area()
{
// circle specific
return 1;
}
public override void draw()
{
// draw a circle
}
}

class TriangleEntity : PolyGeometricEntity
{
public override int area()
{
// triangle specific
return 1;
}
public override void draw()
{
// draw a triangle
}
}


class PolyCanvas
{
List<PolyGeometricEntity> entities = new List<PolyGeometricEntity>();

void CreateEntity(string toCreateClass)
{
// assume that code is called by the ui
// you do not know what the user decides at runtime
// Polymorphism "starting" now:
PolyGeometricEntity toCreate = null;
if (toCreateClass == "c") { toCreate = new CircleEntity(); }
else if (toCreateClass == "t") { toCreate = new TriangleEntity(); }
entities.Add(toCreate);
}

void ReDraw()
{
foreach (PolyGeometricEntity toDraw in entities)
{
toDraw.draw(); // polymorphism in action!
}
}
}


// example WITHOUT implicit polymorphism
abstract class NonPolyGeometricEntity
{
public int center_x__mm;                    // commen superset
public int center_y__mm;                    // commen superset

public string entityClass;

public void move(int d_x__mm, int d_y_mm)   // commen superset
{

}

// explicid Polymorphism, but concept of Polymorphism still present
public int area()
{
if (entityClass == "c")
{
// return area of cirlce
}
else if (entityClass == "t")
{
// return area of triangle
}
return 0;
}
public void draw()
{
if (entityClass == "c")
{
// draw area of cirlce
}
else if (entityClass == "t")
{
// draw area of triangle
}
}
}





class NonPolyCanvas
{
List<NonPolyGeometricEntity> entities = new List<NonPolyGeometricEntity>();

void CreateEntity(string toCreateClass)
{
// assume that code is called by the ui
// you do not know what the user decides at runtime
NonPolyGeometricEntity toCreate = null;
toCreate.entityClass = toCreateClass;   //explit polymorphism
entities.Add(toCreate);
}

void ReDraw()
{
foreach (NonPolyGeometricEntity toDraw in entities)
{
toDraw.draw();
}
}
}