【发布时间】:2019-02-23 14:25:16
【问题描述】:
我想使用一个使用子类比较函数的超类排序。我试图在下面的代码中提炼出问题的本质。这不是“生产”代码,但在此处显示以进行说明。已经测试过了。
#!/usr/bin/perl
# $Id: foo,v 1.10 2019/02/23 14:14:33 bennett Exp bennett $
use strict;
use warnings;
package Fruit;
use Scalar::Util 'blessed';
sub new {
my $class = shift;
my $self = bless({}, $class);
$self->{itemList} = [];
warn "Called with class ", blessed $self, "\n";
return $self;
}
package Apples;
use parent qw(-norequire Fruit);
sub mySort {
my $self = shift;
@{$self->{itemList}} = sort compare @{$self->{itemList}};
return $self;
}
sub compare {
$a->{mass} <=> $b->{mass};
}
package main;
my $apfel = Apples->new();
push(@{$apfel->{itemList}}, { "name" => "grannysmith", "mass" => 12 });
push(@{$apfel->{itemList}}, { "name" => "macintosh", "mass" => 6 });
push(@{$apfel->{itemList}}, { "name" => "Alkmene", "mass" => 8 });
$apfel->mySort();
for my $f (@{$apfel->{itemList}}) {
printf("%s is %d\n", $f->{name}, $f->{mass});
}
exit 0;
我想做的是将mySort()移动到抽象超类Fruit。我尝试了多种解决$self->compare() 子例程的方法,但运气不佳。
有什么想法吗?
我已经让它调用正确的子例程,但从来没有使用正确的$a 和$b。我已将所有失败的尝试都排除在这个问题之外,希望有人会立即知道如何将 mySort() 移动到 Fruit 包,以便我可以使用相同的子程序对橘子进行分类。
【问题讨论】:
-
嗯,我当然有一些事情要检查下面的答案。我会在一段时间内回复大家。到目前为止,所有的答案似乎都是一致的。 @ikegami 建议我可能会尝试将苹果与橙子进行比较。永远不会是这样。我只想在不同的子类上调用相同的
mySort(),每个子类都有自己的compare()。到目前为止,答案看起来很有希望。
标签: perl subclass superclass subroutine