C ++ - как использование Moose с Perl для ООП - PullRequest
6 голосов
/ 27 августа 2009

Я играл с Мусом, почувствовал это. Я хотел бы привести пример чисто виртуальных функций, как в C ++, но на языке Moose (особенно в стиле C ++). Я знаю, что даже при использовании Moose более строгой модели, чем у обычного Perl, есть еще несколько способов сделать то, что я спрашиваю (с помощью модификаторов методов или вызовов SUPER::). Вот почему я специально спрашиваю о реализации, максимально похожей на C ++. Что касается "почему?" этого ограничения? В основном любопытство, но также планируем перенести некоторый код C ++ на Perl с Moose таким образом, чтобы люди, ориентированные на C ++, могли в основном идентифицировать себя с *. 1004 *

Ответы [ 4 ]

5 голосов
/ 28 августа 2009

Возможно, вы захотите взглянуть на Джесси Люрса. MooseX :: ABC . Кажется, очень похоже на некоторые реализации здесь. Из резюме:

package Shape;
use Moose;
use MooseX::ABC;

requires 'draw';

package Circle;
use Moose;
extends 'Shape';

sub draw {
    # stuff
}

my $shape = Shape->new; # dies
my $circle = Circle->new; # succeeds

package Square;
use Moose;
extends 'Shape'; # dies, since draw is unimplemented

Я знаю, что Джесси - программист на С ++ в течение дня.

5 голосов
/ 27 августа 2009

Я могу думать об этом, используя роли вместо подклассов:

{
    package AbstractRole;
    use Moose::Role;
    requires 'stuff';  
}

{
    package Real;
    use Moose;
    with 'AbstractRole';
}

Это даст ошибку компиляции, потому что в Real не определены вещи .

Добавление метода stuff в Real теперь заставит его работать:

{
    package Real;
    use Moose;
    with 'AbstractRole';

    sub stuff { print "Using child function!\n" }
}
2 голосов
/ 27 августа 2009

Похоже, я не могу делать с Мусом именно то, что хочу, но я могу очень близко подойти к Ролям. Вот информация из руководства Moose entry для ролей:

Роли против абстрактных базовых классов

Если вы знакомы с концепцией абстрактных базовых классов в других языки, вы можете испытать желание использовать роли в том же духе.

Вы можете определить «только интерфейс» роль, которая содержит только список необходимые методы.

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

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

1 голос
/ 27 августа 2009

Вот моя попытка (без ролей, информацию о ролях смотрите в других ответах):

package Abstract;
use Moose;

sub stuff;

package Real;
use Moose;
extends 'Abstract';

override 'stuff' => sub { print "Using child function!\n"; }
...