Полиморфизъм

от Всичко за 1 лев, свободната енциклопедия

Revision as of 21:11, 28 юни 2006; view current revision
←Older revision | Newer revision→

Концепция в ИТ системите, според която един предмет се използва за множество неспецифични функции. Примери за полиморфизъм са:

  • Ползване на краставица за вибратор

Като цяло полиморфизмът усложнява значително ИТ системите и смъква многократно тяхната ефективност, но програмистите, умели в ползването му, се чувстват по-умни и това допринася за широкото му разпространение.


За радост на студенти и ученици и ужас на Големите глави е възможно полиморфизма да се обясни по прост начин.


Проблемът с повечето статии по компютърни науки е, че примерите не са интересни. Полиморфизма всъщност не е труден за разбиране, но примерите обикновено са скучни или трудни за разбиране. Това е алтернативна статия която се опитва да използва предметна област с която учащите са запознати, за да обясни програмните концепции прости.


Необходими умения: Познаване на класове и обекти и умение да се чете Java/C# код


Полиморфизма не би трябвало да е нова концепция за никой. Срещаме се с него всеки ден в реалния свят. Има повече от един вид котки за одиране, но всички се дерат по един и същ начин, дори ако инстанцията е напълно нова за нас. Да речем, че искаме да ебем дупка. Ебем всички дупки еднакво. Не ни интересува дали дупката е уста, гъз или путка – пак ще я ебем по същия начин. Обаче устата, путката или гъзът може да реагират различно на ебането.


Имаме общ абстрактен клас на име 'Hole' (дупка) и 3 обикновени класа Pussy(путка), Ass(гъз) i Mouth(уста).


class Pussy : Hole {}


class Mouth : Hole {}


class Ass : Hole {}


Имаме също Penis.Fuck(Hole h) метод. Класът Penis не се интересува от специфичната инстанциа на Hole, той ще я ебе по същия начин каквато и да е. В частност мушкаме в дупката(Hole) пениса докато пениса(Penis) докато пениса свърши. И накрая предаваме на дупката товара на пениса.

   class Penis
   {
       public void Fuck(Hole h)
       {
           while (!this.isSpent)
           {
               h.TakeAThrust(this);
               this.arousal++;
               if (arousal > 500)
                   this.isSpent = true;
           }
           h.TakeALoad(this.load);
       }

Ето тук полиморфизмът става забавен. Дупката ще реагира по различен начин на мушкането и товара в зависимост от това каква точно дупка е.


Първо трябва да създадем абстрактен клас, който дефинира абстрактен интерфейс.

   abstract class Hole
   {
       public abstract void TakeAThrust(Penis p);
   
       public abstract void TakeALoad(Load l);
   }

И сега ни остава само да напишем различни имплементации на тези методи в различните класове. Например имплементациата на TakeAThrust(поемане на мушкане) за Ass(гъз) може да изглежда така:

     public void TakeAThrust(Penis p)
     {
         if (!enoughLube && p.Circumference > 6)
         {
              analFissureCount++;
         }
     }

Вижте колко е елегантно... Няма нужда пениса да знае, че ебе гъз за да може гъза да се държи като истински гъз.


Сега нека видим как може да се имплементира TakeALoad по различен начин за Mouth i Pussy:

       //in Pussy
       Random rnd = new Random();
       public void TakeALoad(Load l)
       {
           //randomly determine whether to cause a pregnancy with a 10% chance...
           if (rnd.Next() % 10 == 0)
           {
               this.Woman.EggFactory.Egg.Inseminate(l);
           }
       }
       //in Mouth
       Random rnd = new Random();
       
       public void TakeALoad(Load l)
       {
           //50-50 chance of spitting or swallowing
           if (rnd.Next() % 2 == 0)
           {
               this.Spit(l);
           }
           else
           {
               this.Swallow(l);
           }
       }

Нека го сглобим с клиентски код.


Сега когато имаме планирани класове с мисълта за полиморфизъм, може да видим разкоша с който разполагаме от клиентския код.

   //create an array of 4 women
   Woman[] women = new Woman[] { new Woman(), new Woman(), new Woman(), new Woman() }; 
   //create a hole array to reference the holes of all 4 women, plus two additional holes.
   Hole[] holes = new Hole[4 * 3 + 2];
   for (int i = 0; i < women.Length; i++)
       {
           holes[3 * i + 0] = women[i].Mouth;
           holes[3 * i + 1] = women[i].Pussy;
           holes[3 * i + 2] = women[i].Ass;
       }
   //additional holes (so the faggy programmers don't feel left out)
           Man m = new Man();
           holes[12] = m.Mouth;
           holes[13] = m.Ass;


   //now we loop through the holes and fuck them all with the same Penis 
           Penis p = new Man().Penis;
           foreach (Hole h in holes)
           {
               p.Fuck(h);
           }

Виждате ли колко е лесно в клиентския код?

Благодаря за вниманието, колеги. Въпроси?

Оригинал: http://www.kuro5hin.org/story/2006/3/14/175929/544

Лични инструменти