Эффективный подход без растяжения изображения 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))
Я думаю, что вся идея обязательной реализации / перегрузки функций / подпрограмм базового класса чужда Perl. В какой момент вы могли бы представить, что механизм принудительного исполнения работает?
Если вы согласны делать это во время выполнения, вы можете умереть, если будет вызвана реализация вашего базового класса.
РЕДАКТИРОВАТЬ: На самом деле, да, Class :: Contract кажется быть путем.
Вот ответ с использованием Moose ...
package Comparable;
use Moose::Role;
requires 'eq';
package Person;
has size => (
is => 'ro',
does => 'Comparable',
);
Теперь атрибут размера должен быть объектом, который реализует "интерфейс" Comparable. В Mooseland интерфейсы - это роли, а роли могут быть чем-то большим, чем просто определение интерфейса.
Я не уверен, как вы сможете это реализовать. Однако взгляните на Moose , который представляет собой «постмодернистскую объектную систему для Perl 5».
В этом может помочь Class :: Contract . Он поддерживает проверку контракта во время компиляции.
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' )
Простое решение, которое создает ошибки во время выполнения:
package SomeVirtualClass;
use strict;
use warnings;
use Carp;
sub some_method { croak "virtual method some_method not overridden" }