Полиморфизъм
от Всичко за 1 лев, свободната енциклопедия
Концепция в ИТ системите, според която един предмет се използва за множество неспецифични функции. Примери за полиморфизъм са:
- Ползване на краставица за вибратор
- Геврек за тоалетна чиния
Като цяло полиморфизмът усложнява значително ИТ системите и смъква многократно тяхната ефективност, но програмистите, умели в ползването му, се чувстват по-умни и това допринася за широкото му разпространение.
За радост на студенти и ученици и ужас на Големите глави е възможно полиморфизма да се обясни по прост начин.
Проблемът с повечето статии по компютърни науки е, че примерите не са интересни. Полиморфизма всъщност не е труден за разбиране, но примерите обикновено са скучни или трудни за разбиране. Това е алтернативна статия която се опитва да използва предметна област с която учащите са запознати, за да обясни програмните концепции прости.
Необходими умения: Познаване на класове и обекти и умение да се чете 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); }
Виждате ли колко е лесно в клиентския код?
Благодаря за вниманието, колеги. Въпроси?
Оригинал: http://www.kuro5hin.org/story/2006/3/14/175929/544