Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Объясните доходчив пожалуйста про полиформизм


Автор: gogzor 12.2.2008, 17:57
Привет всем.

В процессе изучения принципов ООП , понял всё , кроме полиформизма...
Прочитал кучу описаний , но там всё написано слишком замороченым языком.

Объясните мне пожалуйста попроще : что такое полиформизм , с каким-нибудь простеньким примером.  smile 
Я просто хочу чётко понять ЧТО ЭТО , ДЛЯ ЧЕГО он используется и КОГДА.

Заранее благодарен.

Автор: Able 12.2.2008, 21:41
Если кратко , то это то, что позволяет по разному использовать один и тот же метод в "новых" унаследованных классах (производных классах) т.е. "для переопределения поведения производных классов" [Троелсен Э. C# и .NET, 168-170].

Автор: gogzor 12.2.2008, 21:54
Как это использовать один метод по разному? У него же функция одна.
Override тут я так понимаю не причем?

 smile 

Автор: Able 12.2.2008, 22:12
Еще как причем но это классический полиморфизм.
Так же существует понятие абстрактного класса и метода.
А тебе что конкретно не понятно с полиморфизмом?
давай твой пример где ты чего то не понял?

Автор: Raid 13.2.2008, 01:02
Залил лекцию и практическое занятие по теме полиморфизм. Если вдумчиво прочитаешь, то наверняка разберешься http://dump.ru/files/o/o380359150/

Автор: Legolas 13.2.2008, 01:08
gogzor, существует несколько методов использования полиморфизма: я использую полиморфизм методом переопределения и методом перегрузки.  я тебе могу скинуть лекцию из инста про полиморфизм - там очень доходчиво это всё расписывается, куча примеров с подробнейшими комментами.

лекция - http://slil.ru/25466740

если не поймешь пиши здесь - попробую объяснить.

Добавлено через 4 минуты и 20 секунд
класс!!! одно и тоже скинули  smile  smile 

Автор: gogzor 13.2.2008, 03:39
Спасибо за отличную лекцию!
Начинаю понимать. Если что , отпишусь.

Автор: gogzor 16.2.2008, 14:58
Люди.

Вот скажите :

Я создал интерфейс.
Прописал там нужный метод .

Потом в каждом классе , где я реализую этот интерфейс , этот метод переопределяется по своему , это же тоже принцип полиморфизма - многоформенности?

Автор: FractalizeR 16.2.2008, 23:05
Полиморфизм в том, что при вызове этого метода, в зависимости от типа экземпляра будут вызваны разные реализации этого метода. Так что, в принципе, вы правы.

Автор: source777 19.2.2008, 00:05
gogzor, самое понятное определение полиморфизма:
"Полиморфизмом называется свойство некоторых веществ существовать в нескольких кристаллических фазах, отличающихся по симметрии структуры и по свойствам. Каждая из этих фаз, стабильная в определенной области температур и давлений, называется полиморфной модификацией." (с) Шаскольская М.П.

Применительно к программированию это переводится как:
"Полиморфизмом называется свойство некоторых объектов в зависимости от внешних условий вызывать различные полиморфные модификации определенного метода" smile 

Автор: Able 20.2.2008, 15:12
на пример ВОДА... лед, жидкость, пар  а вещество одно и тоже...

gogzor, да так...

Автор: source777 20.2.2008, 22:44
Цитата

на пример ВОДА... лед, жидкость, пар  а вещество одно и тоже...
Нет, это разные агрегатные состояния... полиморфизм подразумевает одно и то же агрегатное состояние для всех модификаций... Например, тот же лёд обладает множеством полиморфных модификаций... 
Впрочем классический пример полиморфизма - это белое и серое олово, причем такой полиморфизм называют ещё аллотропией, т.к. один химический элемент в соединении. Аллотропия - частный случай полиморфизма, если аллотропные модификации имеют одинаковую хим.формулу (эквивалент для программирования - сигнатура метода)...
Так что наличие методов с разной сигнатурой, но одним именем (проще говоря, перегруженных), правильнее называть аллотропией, а не статическим полиморфизмом, как это принято smile 

Автор: Exception 25.2.2008, 01:31
Вы чего-то всё усложняете. Полиморфизм -- это когда мы общаемся с некоторым базовым методом, не волнуясь о том, переопределён ли он в дочерних классах и что на самом деле делает.

Пример: все животные (класс Animal) умеют издавать звуки (метод MakeSound), но при этом разные животные -- по-разному (переопределённые версии MakeSound в дочерних классах).
В данном случае мы объявим MakeSound как абстрактный метод (то есть у него вообще нет реализации), и реализуем его в дочерних классах:

Код
abstract class Animal {
        public abstract string MakeSound ();
}

class Dog : Animal {
        public override string MakeSound ()
        {
                return "Гав!";
        }
}

class Cat : Animal {
        public override string MakeSound ()
        {
                return "Мяу!";
        }
}


Вся фишка полиморфизма заключается в том, что теперь нам необязательно знать, какой именно класс используется, чтобы вызвать базовый метод, потому что вызвана будет именно переопределённая версия:

Код
class EntryPoint {
        public static void Main ()
        {
                Animal someAnimal = new Cat ();
                Console.WriteLine (someAnimal.MakeSound ()); // "Мяу!"
                Animal anotherAnimal = new Dog ();
                Console.WriteLine (anotherAnimal.MakeSound ()); // "Гав!"

                // Мы даже можем передать экземпляр Dog или Cat в метод, который
                // принимает объекты базового класса Animal, и этот метод
                // сможет вызывать соответствующие реализации MakeSound ()
                // как если бы он вызывал их напрямую у объектов Cat или Dog:
                HandleAnimal (someAnimal); // передаём экземпляр кота -- самому коту это вряд ли понравилось бы
        }

        private static void HandleAnimal (Animal animal)
        {
                // В нашем случае на консоль пять раз будет выведено
                // Cat said Мяу!
                for (int i = 0; i < 5; i++)
                        Console.WriteLine ("{0} said {1}", animal.GetType ().Name, animal.MakeSound ());
        }
}

Автор: SKrivosein 25.2.2008, 02:57
А ещё так с интерфейсами...
Код

namespace CatDog_and_Wafe
{
    class Program
    {
        static void Main(string[] args)
        {

            Cat cat = new Cat();
            Console.WriteLine(cat.GetHabits);
            Dog dog = new Dog();
            Console.WriteLine(dog.GetHabits);
            Wafe wafe = new Wafe();
            Console.WriteLine(wafe.MakeSound());
            Console.WriteLine(wafe.GetHabits);

            //или так...
            Animal someAnimal = new Cat();
            Animal anotherAnimal = new Dog();
            IHasHabits ihabits;
            ihabits = (IHasHabits)someAnimal;
            Console.WriteLine(ihabits.GetHabits);
            ihabits = (IHasHabits)anotherAnimal;
            Console.WriteLine(ihabits.GetHabits);
            ihabits = (IHasHabits)wafe;
            Console.WriteLine(ihabits.GetHabits);
        }
    }
    abstract class Animal
    {
        public abstract string MakeSound();
    }

    class Dog : Animal, IHasHabits
    {
        public override string MakeSound()
        {
            return "Гав!";
        }
        public string GetHabits
        {
            get { return "Виляю хвостом..."; }
        }
    }

    class Cat : Animal, IHasHabits
    {
        public override string MakeSound()
        {
            return "Мяу!";
        }
        public string GetHabits
        {
            get { return "Трусь о ноги..."; }
        }
    }

    class Wafe : IHasHabits          //не родственый класс
    {
        public string MakeSound()
        {
            return "Твою мать!";
        }
        public string GetHabits
        {
            get { return "Bытягую скалку... "; }
        }
    }
    public interface IHasHabits
    {
        string GetHabits { get; }
    }

}


полиморфизм через интерфейсы подержуют и независимые от себя классы.
Авторские права на зверьё у Exception smile 

Автор: SKrivosein 25.2.2008, 03:31
А это мы имеем на диаграмме Visual Studia
http://ipicture.ru/Gallery/Viewfull/689090.html

Автор: Exception 25.2.2008, 14:31
Я бы всё-таки переименовал IHabits в IHasHabits, а MethodHabits -- в GetHabits (или, что ещё лучше, сделал бы read-only свойство Habits вместо метода).

Автор: SKrivosein 26.2.2008, 02:47
Извиняюсь,эт я сначала хотел метод написать,а потом в 3 часа ночи переписывать лень было. smile
ИСПРАВИЛ! smile  

Автор: Able 26.2.2008, 19:20
source777, не о том ты, чудо....  smile 

Автор: source777 26.2.2008, 23:03
Цитата(Able @  26.2.2008,  19:20 Найти цитируемый пост)
source777, не о том ты, чудо....   
Почему же не о том, полиморфизм он везде полиморфизм, а что может быть проще, чем понять изначальный смысл слова, тогда уже не составляет труда понять его применение к любой области...  так что не мысли так узко... к тому же любой частный пример не в силах всесторонне описать явление...

Добавлено через 3 минуты и 10 секунд
SKrivosein, в Main можно всё до строки \"//или так...\" включительно удалить, как не имеющее никакого отношения к полиморфизму
P.S. Тема полиморфизма жены не раскрыта!

Автор: Able 29.2.2008, 03:32
то как мыслим не тема поста...

Тут конкретный вопрос, что есть это... 
а на такой вопрос можно ответить лишь двумя группами способов, других просто нет
Первая это Интенциональная группа - самый простой способ, просто показать пальцем вот смотри. (пример с водой) и 
вторая это Дескриптивный или дефинитивный, т.е. описать максимально, что есть это для выделения его из мира вещей... как сделал Exeption?
вы же описываете своими словами (хочешь объяснить говори на детском языке), не говорите на одном языке с человеком задавшим вопрос!

Вообще на месте задающего вопрос я бы обратился к этимологии слова ПОЛИМОРФ что это и как это... почему ИЗМ...
Полиморфизм — от греч. poly — много и morphe — форма 
Полиморфизм в биологии, наличие в пределах одного вида резко отличных по облику особей, не имеющих переходных форм.
Классический пример - оборотень... сущность одна, а форма разная, как у воды! (сущность т.е. существенное, физика с химией тут не причем)

В программировании же общая идея такова "один интерфейс, множество методов". 

Цитата

Например, для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).


Думаю, что после поста Exeption, вообще не должно возникнуть вопросов, проще некуда... разве, что пример добавить более развернутый, насытить вариантами использования… но не мне гуру дополнять )))

Автор: source777 29.2.2008, 14:45
Цитата(Able @  29.2.2008,  03:32 Найти цитируемый пост)
Тут конкретный вопрос, что есть это... 
Не занудствуй

Цитата(Able @  29.2.2008,  03:32 Найти цитируемый пост)
Классический пример - оборотень... сущность одна, а форма разная
Фантастика не может быть классическим примером...

Цитата(Able @  29.2.2008,  03:32 Найти цитируемый пост)
как у воды
Вода, как и любая жидкость, не обладает полиморфизмом, сколько раз это надо повторить, чтобы до тебя дошло? перечитывай определение, пока не врубишься:
Цитата
"Полиморфизмом называется свойство некоторых веществ существовать в нескольких кристаллических фазах, отличающихся по симметрии структуры и по свойствам. Каждая из этих фаз, стабильная в определенной области температур и давлений, называется полиморфной модификацией."


Цитата(Able @  29.2.2008,  03:32 Найти цитируемый пост)
В программировании же общая идея такова "один интерфейс, множество методов". 
Это ты чьими словами сказал? Впрочем неважно, ибо никакого отношения к полиморфизму эта фраза не имеет...

Автор: Able 14.3.2008, 03:58
Все это Троелсен и Страструп  smile 

Автор: CareyDom 1.7.2022, 11:25
Модератор: Сообщение скрыто.

Автор: TaskGangster 23.7.2022, 20:19
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)