Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните доходчив пожалуйста про полиформизм 
:(
    Опции темы
gogzor
Дата 12.2.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Привет всем.

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

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

Заранее благодарен.
PM MAIL   Вверх
Able
Дата 12.2.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: нет
Всего: 2



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

Это сообщение отредактировал(а) Able - 12.2.2008, 21:48
PM MAIL WWW ICQ   Вверх
gogzor
Дата 12.2.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



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

 smile 
PM MAIL   Вверх
Able
Дата 12.2.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: нет
Всего: 2



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


Это сообщение отредактировал(а) Able - 12.2.2008, 22:14
PM MAIL WWW ICQ   Вверх
Raid
Дата 13.2.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.6.2007
Где: Москва

Репутация: нет
Всего: нет



Залил лекцию и практическое занятие по теме полиморфизм. Если вдумчиво прочитаешь, то наверняка разберешься Посмотри
PM MAIL   Вверх
Legolas
Дата 13.2.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 3
Всего: 5



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

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

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

Добавлено через 4 минуты и 20 секунд
класс!!! одно и тоже скинули  smile  smile 
PM MAIL   Вверх
gogzor
Дата 13.2.2008, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Спасибо за отличную лекцию!
Начинаю понимать. Если что , отпишусь.
PM MAIL   Вверх
gogzor
Дата 16.2.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Люди.

Вот скажите :

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

Потом в каждом классе , где я реализую этот интерфейс , этот метод переопределяется по своему , это же тоже принцип полиморфизма - многоформенности?
PM MAIL   Вверх
FractalizeR
Дата 16.2.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: нет
Всего: 4



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

Это сообщение отредактировал(а) FractalizeR - 16.2.2008, 23:05


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
source777
Дата 19.2.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



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

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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Able
Дата 20.2.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 13.6.2006
Где: Тюмень

Репутация: нет
Всего: 2



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

gogzor, да так...
PM MAIL WWW ICQ   Вверх
source777
Дата 20.2.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата

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

Это сообщение отредактировал(а) source777 - 20.2.2008, 22:45


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Exception
Дата 25.2.2008, 01:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 1
Всего: 186



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

Пример: все животные (класс 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 ());
        }
}


Это сообщение отредактировал(а) Exception - 25.2.2008, 01:34
PM   Вверх
SKrivosein
Дата 25.2.2008, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



А ещё так с интерфейсами...
Код

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 - 27.2.2008, 03:09


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
SKrivosein
Дата 25.2.2008, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



А это мы имеем на диаграмме Visual Studia
user posted image

Это сообщение отредактировал(а) SKrivosein - 26.2.2008, 03:00


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1673 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.