Полиморфизм параметром функции

Хорошо - это может быть очень глупым вопросом, но он беспокоил меня.

Есть ли язык где

class Animal;
class Ape : public Animal
{...}

void doStuff(Animal* animalPtr)
{
    cout << "doing animal stuff" << endl;
}

void doStuff(Ape* apePtr)
{
    cout << "doing ape stuff" << endl;
}

Animal *ape = new Ape();
doStuff(ape);

уступил бы "doing ape stuff"? (терпите меня использующий синтаксис C++) Для разъяснения я хочу "функцию, которая принимает аргумент и действует на него согласно типу аргумента".

И это имело бы смысл? Конечно, как разработчик необходимо было бы заботиться начиная с экземпляров, которые смотрят точно так же, как указатель Животных мог бы на самом деле назвать код Обезьяны, потому что во времени выполнения это - указываемый экземпляр Обезьяны.

11
задан msi 30 January 2010 в 21:27
поделиться

5 ответов

Не можете ли вы использовать hstack и vstack? См. здесь . Например:

>>> import numpy as np
>>> b = np.array([0]*4)
>>> b.shape = (2,2)
>>> w = b + 0xAA
>>> r1 = np.hstack((b,w,b,w,b,w,b))
>>> r2 = np.hstack((w,b,w,b,w,b,w))
>>> board = np.vstack((r1,r2,r1,r2,r1,r2,r1))
-121--2111422-

Для получения того же эффекта можно использовать переменные аргументы . Без строгой типизации не имеет смысла добавлять, учитывая аргументы по умолчанию и все остальные «работы вокруг».

-121--790041-

Да, есть! Это называется multiple dispatch . Статья в Википедии очень хорошая. К сожалению, он, кажется, поддерживается только через расширения языка для большинства популярных языков, но есть несколько (в основном эзотерических) языков, которые поддерживают его изначально.

7
ответ дан 3 December 2019 в 07:12
поделиться

Здесь есть некоторое несоответствие, которое сбивает с толку. Вы хотите функцию, которая принимает аргумент и действует на нем в соответствии с типом аргумента? Это действительно не будет полиморфизмом, поскольку функции находятся на их одиночном, они не являются методами, принадлежащими к иерархии класса или интерфейса. Другими словами, его вроде как смешивание OO Paradigms с процедурными парадигмами.

Если это тип, который вы хотите параметризовать, а не переменную, вы бы использовали что-то вроде дженериков Java. С Regrics вы можете сообщить методу, который тип параметра, приходящего, также будет переменной. Способ действует на тип переменного общего моды.

1
ответ дан 3 December 2019 в 07:12
поделиться

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

1
ответ дан 3 December 2019 в 07:12
поделиться

Взгляните на шаблон посетителей

7
ответ дан 3 December 2019 в 07:12
поделиться

Open Multi-Methods for C++, авторами которого являются Петр Пиркельбауэр, Юрий Солодкий и Бьярне Штроуструп.

В данной статье обсуждается расширение языка для интеграции мультиметодов в С++, а также некоторые очень интересные детали реализации, такие как работа с динамически подгружаемыми библиотеками и реальная раскладка для правильной диспетчеризации. Обратите внимание, что он пока не является частью стандарта Си++ и, вероятно, не входит ни в один крупный компилятор.

1
ответ дан 3 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: