Я могу создать подобные Java интерфейсы в Perl?

Эффективный подход без растяжения изображения Swift 4

// Method to resize image
func resize(image: UIImage, toScaleSize:CGSize) -> UIImage {
                UIGraphicsBeginImageContextWithOptions(toScaleSize, true, image.scale)
                        image.draw(in: CGRect(x: 0, y: 0, width: toScaleSize.width, height: toScaleSize.height))
                        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
                        UIGraphicsEndImageContext()
                        return scaledImage!
                }

// Вызов метода

    let resizedImage = self.resize(image: UIImage(named: "YourImageName")!, toScaleSize: CGSize(width: 290, height: 390))
13
задан brian d foy 2 July 2009 в 14:25
поделиться

6 ответов

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

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

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

5
ответ дан 1 December 2019 в 17:36
поделиться

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

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

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

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

28
ответ дан 1 December 2019 в 17:36
поделиться

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

10
ответ дан 1 December 2019 в 17:36
поделиться

В этом может помочь Class :: Contract . Он поддерживает проверку контракта во время компиляции.

6
ответ дан 1 December 2019 в 17:36
поделиться

I have a lightweight pattern I call "Compatible", and I discuss it in my answer to How important is it to indicate if a class implements an interface in Perl?

It's just a matter of sticking pseudo packages in @ISA:

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

You break their code if you don't do what they expect from X. In practice I have a bunch of documented behaviors that I reuse, but a class telling me it's X::Compatible is what I use to assure myself that it can do what I expect.

Since perl 5.10 has introduced the DOES concept, which is about as lightweight, a X::Compatible object inherits from a base class Object::Compatible which implements a base DOES by looking through @ISA for /::Compatible$/ and replying to the affirmative for anything in there. The idea is that:

$object->DOES( $x ) == $object->isa( $x . '::Compatible' )
2
ответ дан 1 December 2019 в 17:36
поделиться

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

package SomeVirtualClass;

use strict;
use warnings;

use Carp;

sub some_method { croak "virtual method some_method not overridden" }
1
ответ дан 1 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

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