面向对象下面几步

高效的属性存储:

我们一向使用散列表来存储对象属性,我们这样做有几个好的理由:


1.每个属性都是自我描述的(也就是说,每个属性的名字和类型可以很容易的从对象中获取),

这样可以很容易的来编写可读性好的代码。它还可以使模块无需对象显示合作就能够进行自动的

对象持续性存储或对象的可视化。

2.位于继承层次中的每个类都可以自由独立的添加属性


ObjectTemplate:使用数组来存储属性:


这一节展示的模块使用数组来存储属性(但是不是那种每个对象一个数组的方式)


注意:Perl 允许你不存在用法歧义的情况下,省略任何调用方法的括号。

与前面的例子一样,任何跟在箭头后面的单词都被当作是一个方法。


Vsftp:/root/perl/19# cat ObjectTemplate.pm 
package ObjectTemplate;
  require Exporter;    
  @ISA = qw(Exporter);    
  @EXPORT_OK = qw(new position);
 sub new {
         my $self = {};    
         my $class = shift;  ##第一个参数类的名字;
         my $self ={@_};
         bless $self,$class;
    return $self;
};
  sub position {
        my $self=shift;
        my $Actress=shift;
        return "$Actress.length$Actress"
         };
1;
Vsftp:/root/perl/19# cat Employee.pm 
package Employee;
use ObjectTemplate qw/new position/;
1;



Vsftp:/root/perl/19# cat a1.pl 
unshift(@INC,"/root/perl/19");
use Employee;
use Data::Dumper;
$obj = Employee->new("name"=>"Normae Jean",
                     "age" =>25
                     )  ##new()方法由ObjectTemplate创建

;
print Dumper($obj);
print "\n";
print $obj->{name};
print "\n";

print $obj->{age};
print "\n";
print $obj->position("Actress");
Vsftp:/root/perl/19# perl a1.pl 
$VAR1 = bless( {
                 'name' => 'Normae Jean',
                 'age' => 25
               }, 'Employee' );

Normae Jean
25
Actress.lengthActressVsftp:/root/perl/19# 



Vsftp:/root/perl/19# cat Employee.pm 
package Employee;
use ObjectTemplate qw/new position/;
sub promote {
    my $self=shift;
    my $current_position=$self->position(); ##获取属性
    my $next_position = $current_position."abc123";
   $self->position($next_position);
     };
1;

Vsftp:/root/perl/19# cat a1.pl 
unshift(@INC,"/root/perl/19");
use Employee;
use Data::Dumper;
$obj = Employee->new("name"=>"Normae Jean",
                     "age" =>25
                     )  ##new()方法由ObjectTemplate创建

;
print Dumper($obj);
print "\n";
print $obj->{name};
print "\n";

print $obj->{age};
print "\n";
print $obj->position("Actress");
print "\n";
print $obj->promote();
Vsftp:/root/perl/19# perl a1.pl 
$VAR1 = bless( {
                 'name' => 'Normae Jean',
                 'age' => 25
               }, 'Employee' );

Normae Jean
25
Actress.lengthActress
.lengthabc123.length.lengthabc123Vsftp:/root/perl/19# 

转载于:https://www.cnblogs.com/zhaoyangjian724/p/6198940.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于面向对象编程的问题。根据题目中的要求,我们需要设计一个继承结构,可以分为以下几步: 1. 定义抽象类Shape,提供三个纯虚函数,分别用于显示数据成员、返回面积和返回体积。 2. 派生TwoDimShape和ThreeShape两个类,它们分别代表二维图形和三维图形,并增加了有关的数据成员,但没有成员函数的实现。 3. 在TwoDimShape类中派生Circle、Elipse、Rectangle和Triangle等类,在ThreeShape类中派生Ball、Cylinder、RectangularParallelepiped等类,它们分别代表不同的具体图形。 4. 在主函数中,使用多态方式调用不同对象的求面积和体积等函数,通过指向基类的指针,调用派生类中的函数。 下面是一个示例代码,用于说明如何实现这个继承结构: ``` #include <iostream> #include <cmath> using namespace std; class Shape { public: virtual void showData() = 0; virtual double reArea() = 0; virtual double reVolume() = 0; }; class TwoDimShape : public Shape { protected: double x, y; public: virtual void showData() = 0; virtual double reArea() = 0; }; class Circle : public TwoDimShape { public: Circle(double _x, double _y, double _r) { x = _x; y = _y; r = _r; } void showData() { cout << "圆心坐标:" << x << "," << y << ",半径:" << r << endl; } double reArea() { return M_PI * r * r; } private: double r; }; class ThreeShape : public Shape { protected: double x, y, z; public: virtual void showData() = 0; virtual double reArea() = 0; virtual double reVolume() = 0; }; class Ball : public ThreeShape { public: Ball(double _x, double _y, double _z, double _r) { x = _x; y = _y; z = _z; r = _r; } void showData() { cout << "球心坐标:" << x << "," << y << "," << z << ",半径:" << r << endl; } double reArea() { return 4 * M_PI * r * r; } double reVolume() { return 4.0 / 3 * M_PI * r * r * r; } private: double r; }; int main() { Shape *s1, *s2; Circle c(0, 0, 1); Ball b(0, 0, 0, 1); s1 = &c; s2 = &b; s1->showData(); cout << "圆的面积:" << s1->reArea() << endl; s2->showData(); cout << "球的表面积:" << s2->reArea() << endl; cout << "球的体积:" << s2->reVolume() << endl; return 0; } ``` 在这个示例代码中,我们定义了Shape作为顶层基类,派生了TwoDimShape和ThreeShape两个类。它们分别代表二维图形和三维图形,并增加了有关的数据成员,但没有成员函数的实现。在TwoDimShape类中派生了Circle等类,在ThreeShape类中派生了Ball等类,它们分别代表不同的具体图形。在主函数中,我们使用多态方式调用不同对象的求面积和体积等函数,通过指向基类的指针,调用派生类中的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值