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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм для конкретного случая, ad hoc polymorphism 
:(
    Опции темы
Modul
Дата 25.3.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Так ли я это понял:

Код

namespace ConsoleApplication1
{
    public class Maxi
    {
        public int x;
        public int area;

        public Maxi(int i)
        {
           x = i;
        }
        
        public int myFunc()
        {
            return area= x;
        }
    }
    
    public class Mini
    {
        public int x;
        public int area;
        
        public Mini(int i)
        {
            x = i;
        }

        public int myFunc()
        {
            return area = x;
        }
    }
    
        
     public class Polymorphism
     {
        static void Main(string[] args)
        {
            Maxi maxi = new Maxi(2);
            Console.WriteLine("Maxi={0}", maxi.myFunc() );

            Mini mini = new Mini(3);
            Console.WriteLine("Mini={0}", mini.myFunc() );
        }
     }
}


Заранее спасибо.

--------------------
I'll be back !
PM MAIL   Вверх
mr.DUDA
Дата 26.3.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Это вообще на полиморфизм не похоже. Просто названия методов одинаковые. Но если Троелсен говорит что это полиморфизм, значит так наверное и есть  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 26.3.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(Modul @  25.3.2007,  20:32 Найти цитируемый пост)
Так ли я это понял:

Не, что-то ты не так понял :(

Полиморфизм, ИМХО, не может быть реализован без наследования.
Полиморфизм, это:
1) Подмена метода (свойства) базового класса наследником.
2) Создание ссылки базового типа, но на экземпляр наследника
3) Вызов, "типа" , метод базового класса, вместо которого, по настоящему, будет вызван метод наследника


Нагляднее его пояснит пример:
Код

   class Program
    {
        static void Main(string[] args)
        {
            BaseClass baseTypeRefToDerivedClass = new DerivedClass();

            baseTypeRefToDerivedClass.PolimorficMethod();
            baseTypeRefToDerivedClass.NonPolimorficMethod();

            Console.ReadLine();
        }
    }

    public class BaseClass
    {
        public virtual void PolimorficMethod()
        {
            Console.WriteLine("This is a base class");
        }
        public void NonPolimorficMethod()
        {
            Console.WriteLine("This is a base class");
        }
    }
    public class DerivedClass : BaseClass
    {
        public override void PolimorficMethod()
        {
            Console.WriteLine("This is a derived class");
        }
        public new void NonPolimorficMethod()
        {
            Console.WriteLine("This is a derived class");
        }
    }


Цитата(mr.DUDA @  26.3.2007,  08:54 Найти цитируемый пост)
Но если Троелсен говорит что это полиморфизм, значит так наверное и есть

Врядли  smile 
Что-то я вообще не могу представить полиморфизм без наследования  smile 

Это сообщение отредактировал(а) ivashkanet - 26.3.2007, 15:38
PM MAIL WWW ICQ   Вверх
Дрон
Дата 26.3.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Хмм.... Троелсена не читал. Сейчас вот почитал, что пишет википедия (там ещё есть и по-русски более простая статья) и понял так:
1. Параметрический полиморфизм -- это когда метод реализован одинаково для любого типа данных (т.е. для бесконечного множества типов).
Например:
Код
class SomeClass<T>
{
    public bool DoSomething(T a, T b)
    {
          return a.Equals(b);
    }
}

Но вообще с практической точки зрения смысла в этом маловато, так как совсем общих операций в C# определено всего четыре штуки.
Можно, конечно, ограничить вариации типа T, написав:
Код
class SomeClass<T> where T : ISomeInterface

Но, если я правильно понял, то это уже получается некий компромисс. Вроде как в этом случае полиморфизм "чистый", но поскольку каждый допустимый тип должен реализовать интерфейс ISomeInterface посредством ad-hoc полиморфизма.

2. Специфический (ad hoc)
Это когда для каждого типа данных у нас есть свой собственный обработчик, но в то же время снаружи они выглядят одинаково.
Например так:
Код
    class SomeClass
    {
        public object SomeMethod(int a, int b)
        {
            return (a * 2 + b * 4).ToString();
        }

        public object SomeMethod(string a, string b)
        {
            return a + "_zzz_" + b ;
        }
    }

Т.е. мы определили операции для конечного множества типов. И для каждого типа операция определяется своим специфичным образом.
Кстати из примера видно, что наследование и полиморфизм не связаны smile

Это сообщение отредактировал(а) Дрон - 26.3.2007, 18:01


--------------------
Да. Именно так.
PM   Вверх
nikitao
Дата 26.3.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



г-н Троелсон вот что называет полиморфизмом конкретного случая  в своем первом издании про C# ( в 3 я это не нашел , хотя не очень и искал  smile  ) :
Представим , что у нас есть 3 независимых  класса  , которые реализуют скажем одинаковый метод HelloVingrad(). Это и называется полиморфизмом конкретного случая.  

Насколько я понял в C# это вообще смысла особого не имеет - он его не поддержвает  smile  , а вместо него поддерживается классический полиморфизм. А вот VB 6 поддерживает это чудо и вот это имеет смысл : 

Код

Dim Users(3) as Oject
Set Users(1) = New Admin
Set Users(2) = New Moder
Set Users(3) = New Club
Dim i as Integer
For i = 0 to 3 
 Users.HelloVingrad


Троелсон же рассказал об этом просто для того , чтобы читатель знал о разных его разновидностях. 

Это сообщение отредактировал(а) nikitao - 26.3.2007, 18:27


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Modul
Дата 26.3.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1) C классическим полиморфизмом для С#  все понятно - именно его Троелсен приводит дальше в примере;

Это отметил ivashkanet. Спасибо  smile 

2)  Обратил внимание, что специфический полиморфизм (ad hoc) напоминает перегрузку функций, т.е. функция та же, а тип параметров функции разный;

3)  Если рассматривать полиморфизм методов (функций) исходя из определения polymorphism (много форм), то есть видимо и специфический его вид. 

То есть одна и та же функция ведет себя по-разному.
--------------------
I'll be back !
PM MAIL   Вверх
archeg
Дата 26.3.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nikitao @ 26.3.2007,  18:26)
Насколько я понял в C# это вообще смысла особого не имеет - он его не поддержвает  smile  , а вместо него поддерживается классический полиморфизм. А вот VB 6 поддерживает это чудо и вот это имеет смысл : 
Код

Dim Users(3) as Oject
Set Users(1) = New Admin
Set Users(2) = New Moder
Set Users(3) = New Club
Dim i as Integer
For i = 0 to 3 
 Users.HelloVingrad

Почему же не имеет смысла?
Код

interface MyInterface
        {
            int GeneralMethod();
        }
        class class1 : MyInterface
        {
            const int a  = 1;
            public int GeneralMethod()
            {
                return a;
            }
        }
        class class2 : MyInterface
        {
            const int a = 2;
            public int GeneralMethod()
            {
                return a;
            }
        }
        static void Main(string[] args)
        {
            MyInterface[] array = new MyInterface[2];
            array[0] = new class1();
            array[1] = new class2();

            Console.WriteLine("Класс первый: {0}", array[0].GeneralMethod());
            Console.WriteLine("Класс второй: {0}", array[1].GeneralMethod());
            Console.ReadKey();
        }
    }



--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
nikitao
Дата 27.3.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



archeg,  насколько я понял - это классический вид полиморфизма , поскольку происходит наследование интерфейса.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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