2012-03-05 35 views
5

Tôi đã có thuộc tính lớp trong lớp Moose, nhưng tôi muốn nó hoạt động như Class::Data::Inheritable dưới dạng lớp con ghi đè giá trị của giá trị gốc. Tức là, lớp con kế thừa giá trị của cha mẹ cho đến khi setter được gọi trên lớp con, tại thời điểm đó các giá trị trở nên khác biệt. ví dụ.Thuộc tính lớp Moose hoạt động như Lớp :: Dữ liệu :: Thừa kế

#!/usr/bin/perl 
use warnings; 
use strict; 

{ 
    package Foo; 
    use Moose; 
    use MooseX::ClassAttribute; 
    class_has Item => (is => 'rw'); 
} 

{ 
    package Bar; 
    use Moose; 
    extends 'Foo'; 
} 

Foo->Item(4); 

# This prints "4, 4" as expected 
# 
print join(", ", Foo->Item(), Bar->Item()) . "\n"; 

Bar->Item(5); 

# Would like this to print "4, 5", but it prints "5, 5" 
# 
print join(", ", Foo->Item(), Bar->Item()) . "\n"; 

Cách tốt nhất để có hiệu ứng này, với MooseX::ClassAttribute hoặc cách khác là gì? Có vẻ như hành vi mong muốn đối với bất kỳ lớp w/lớp dữ liệu nào được mong đợi sẽ được kế thừa từ đó.

+1

FWIW Class :: Data :: Inheritable không xung đột với Moose. – Schwern

+1

Schwern: Điều đó có thể đúng, mặc dù các đối tượng Moose phải thừa kế từ Moose :: Object, do đó ít nhất sẽ có nhiều thừa kế liên quan, điều này làm tôi khó chịu. Ngoài ra, bạn không nhận được bất kỳ thuộc tính khai báo thuộc tính Moose nào mà MooseX :: ClassAttribute cung cấp cho bạn. –

Trả lời

0

Tôi biết bạn đã yêu cầu thừa kế nhưng có thể là vai trò sẽ giúp bạn giải quyết vấn đề theo cách khác.

Hãy thử nó với một ví dụ đơn giản:

#!/usr/local/bin/perl 

use strict; 
use feature 'say'; 

{ 
    package Bomb; 
    use Moose::Role; 
    sub fuse { say "Bomb explode" } 
    sub explode { say "Bomb fuse"} 
} 

{ 
    package Spouse; 
    use Moose::Role; 
    sub fuse { say "Spouse explode"} 
    sub explode { say "Spouse fuse"} 
} 

{ 
    package PracticalJoke; 
    use Moose; 
    with 'Bomb' => { excludes => 'explode' }, 
     'Spouse' => { excludes => 'fuse' }; 
} 

my $joke = PracticalJoke->new(); 
$joke->fuse(); 
$joke->explode(); 

Và với 'không bao gồm' bạn biết chính xác có thể kiểm soát những gì nên xảy ra.

Hãy xem why roles are awsome và các trang trình bày từ Ovid về inheritance versus roles.

+0

Bạn có thể tóm tắt các liên kết ở đây trong câu trả lời của bạn; theo cách đó, nếu các liên kết đó biến mất, bạn sẽ không gặp nguy cơ bị xóa. –

+0

OK. Tôi đã thêm ví dụ từ liên kết được đề cập. – smartmeta