Polymorphic copy: Difference between revisions

(Go solution)
Line 865:
 
Oz is not a pure object-oriented language. In fact, most values are not objects. For immutable data it usually does not make sense to clone it because it does not have an identity beyond its value. For mutable data types there are clone functions available (<code>Dictionary.clone</code>, <code>Array.clone</code>, <code>BitArray.clone</code>).
 
=={{header|Perl}}==
<lang Perl>package T;
sub new {
my $cls = shift;
bless [ @_ ], $cls
}
 
sub set_data {
my $self = shift;
@$self = @_;
}
 
sub copy {
my $self = shift;
bless [ @$self ], ref $self;
}
 
sub manifest {
my $self = shift;
print "type T, content: @$self\n\n";
}
 
package S;
our @ISA = 'T';
# S is inheriting from T.
# 'manifest' method is overriden, while 'new', 'copy' and
# 'set_data' are all inherited.
sub manifest {
my $self = shift;
print "type S, content: @$self\n\n";
}
 
package main;
 
print "# creating \$t as a T\n";
my $t = T->new('abc');
$t->manifest;
 
print "# creating \$s as an S\n";
my $s = S->new('SPQR');
$s->manifest;
 
print "# make var \$x as a copy of \$t\n";
my $x = $t->copy;
$x->manifest;
 
print "# now as a copy of \$s\n";
$x = $s->copy;
$x->manifest;
 
print "# show that this copy is indeed a separate entity\n";
$x->set_data('totally different');
print "\$x is: ";
$x->manifest;</lang>
 
=={{header|PHP}}==
Anonymous user