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

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

Revision as of 20:20, 12 юли 2012; 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;
                   this.arousal = 0;
               }
           }
           h.TakeALoad(this.load);
           this.isSpent = false;
       }

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


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

   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);
           }

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

Примера може да се обогати допълнително с добавянето на:

interface Fuckable {
 public abstract void TakeAThrust(Penis p);
 public abstract void TakeALoad(Load l);
} 
interface Fucker
{
 public abstract void Fuck(Fuckable f);
}

Сега Hole ще имплементира Fuckable. Защо е това? Разбира се заради Fist!

public class Fist implements Fuckable, Fucker
{ ... code here ... }

Това ще позволи на лесбииките да се ебат с ръце:

new Woman().getFist().fuck(new Woman().getAss());

a също и също взаимомаструбация при мъжете:

Man man1 = new Man();
Man man2 = new Man();
// Gay mutal mastrubation
man1.getPenis().fuck(man2.getFist();
man2.getPenis().fuck(man1.getFist());

Тук можете да видите, че възможностите са неограничени.

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

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

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