Вопрос по oop, perl – Могу ли я создавать Java-интерфейсы в Perl?

12

Я понимаю, что ОО-модель Perl довольно примитивна; в большинстве случаев это, по сути, взлом пространства имен.

Тем не менее, мне интересно, возможно ли создать что-то вроде «интерфейса»? Моя цель состоит в том, чтобы иметь базовый класс, из которого расширяются другие, основная цель которого состоит в том, чтобы сделать обязательной реализацию определенных методов (по имени, без подписи) этими подклассами. Меня не волнует, является ли он "чисто виртуальным" класс (например, «интерфейс» в Java) или конкретный класс с фактическими заглушками реализации для этих методов в суперклассе, но я хочу сделать детерминистически необходимым, чтобы подкласс реализовывал определенные методы суперкласса.

Это возможно? Если так, то как?

OO Perl не является примитивным, это просто другой подход к концепции. anonymous coward
Я думаю, что он имел в виду примитив с точки зрения предлагаемых функций. У ОО есть несколько руководящих принципов, и инкапсуляция является одним из них. Perl выполняет (большую часть времени) инкапсуляцию по соглашению, если только не используются более современные библиотеки, так что да, OO Perl является примитивным, полагаясь на будущих разработчиков, чтобы поддерживать соглашение вместо строгой проверки времени компиляции. Я имею в виду, что этот человек запрашивает интерфейс / чисто виртуальные классы, и он не существует без расширений. Это не является "полностью функциональным". Edwin Buck
Еще один: я нашел Бена ТиллиAbstractClass на PerlMonks. Я не вижу его в CPAN, но это только один файл, поэтому его легко копировать / вставлять. cxw

Ваш Ответ

6   ответов
10

Я не уверен, как вы сможете это реализовать. Тем не менее, посмотрите налось, которая является «постмодернистской объектной системой для Perl 5».

С Moose роли могут выполнять функцию интерфейса Java. Они также могут делать больше, но роль, у которой есть только список необходимых методов, - это интерфейс.
5

Я думаю, что сама идея предписания реализации / перегрузки функций / подпрограмм базового класса чужда Perl. В какой момент вы предполагаете, что механизм принуждения будет работать?

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

РЕДАКТИРОВАТЬ: На самом деле, да, Class :: Contract, кажется, путь.

6

Класс :: Договор могу помочь с этим. Он поддерживает проверку контракта во время компиляции.

2

У меня есть облегченный шаблон, который я называю «Совместимый», и я обсуждаю его в своем ответеНасколько важно указать, реализует ли класс интерфейс в Perl?

Это просто вопрос прикрепления псевдопакетов в@ISA:

our @ISA = qw<... X::Compatible ...>;

Вы нарушаете их код, если не делаете того, от чего они ожидаютX, На практике у меня есть несколько задокументированных способов поведения, которые я повторно использую, но класс рассказывает мне об этом.X::Compatible это то, что я использую, чтобы убедиться, что он может делать то, что я ожидаю.

Так как Perl 5.10 ввелDOES концепция, которая примерно так же легка,X::Compatible объект наследуется от базового классаObject::Compatible который реализует базуDOES просматривая@ISA за/::Compatible$/ и отвечая утвердительно на что-нибудь там. Идея в том, что:

$object->DOES( $x ) == $object->isa( $x . '::Compatible' )
1

Простое решение, которое создает ошибки во время выполнения:

package SomeVirtualClass;

use strict;
use warnings;

use Carp;

sub some_method { croak "virtual method some_method not overridden" }
Ну да, без сомнения, это возможно. Честно говоря, я искал что-то на более семантическом уровне. Alex Balashov
27

Вот ответ с использованиемлось ...

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

has size => (
    is   => 'ro',
    does => 'Comparable',
);

Теперь атрибут size должен быть объектом, который реализует Comparable & quot; интерфейс & quot ;. В Moose-land интерфейсы - это роли, а роли могут быть больше, чем просто определение интерфейса.

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