老xu的Perl OO培训

Achilles Xu(29196159)  17:19:50

package Dog; 

sub new {
   my $pkg = shift;
   my $name = shift;
   return bless {name => $name}, $pkg;
} 

sub shout {
   my $self = shift;
   print "my name is " . $self->{name};
}
1;



这个就是基本的类定义。

调用是这样: my $x = Dog->new;    $x->shout();

尼摩船长(909129666)  17:20:41
new是干嘛的?为什么总是每次调用的时候先要->new?


NetKey(67212915)  17:20:55
创建对象的一个实例


扬眉剑(513428834)  17:20:56
可以用其他的
你也可以用creat


Achilles Xu(29196159)  17:21:13
new就是一个普通函数。


扬眉剑(513428834)  17:21:22
创建的意思


CGI.NET(318274085)  17:21:27
学对象的话不如先看JAVA


Achilles Xu(29196159)  17:21:31
这里主要他的返回值特别。
return bless {name => $name}, $pkg;
一个哈希,经过bless以后,就跟一个包绑定了。

Achilles Xu(29196159)  17:23:13
以后通过   $x->shout 这样的调用, 就会转化成 Dog::shout($x); 这样的调用。
所以perl面向对象的本质就是使用bless,把数据(标量)跟包绑定起来。


Achilles Xu(29196159)  17:24:14
That is all。
好了,可以提问了。


NetKey(67212915)  17:25:00
$pkg表示?


Achilles Xu(29196159)  17:26:26
my $x = Dog->new;   执行这句的时候,相当于调用: Dog::new('Dog');


weiwei(332003348)  17:26:26
Dog ?


Achilles Xu(29196159)  17:26:40
这是->符号的特性。
你也可以跟__PACKAGE__绑定


狂羽(369316748)  17:27:22
::和->啥区别


扬眉剑(513428834)  17:27:24
子程序的引用,是吗?


Achilles Xu(29196159)  17:27:27
return bless {}, __PACKAGE__;
箭头才会往函数参数列表前面多插东西。


尼摩船长(909129666)  17:28:13
把一个匿名散列和包绑定?


Matthew(657196500)  17:28:40
   my $pkg = shift;
   my $name = shift;
这里两次shift
调用的时候,都没给一个参数,怎么就shift两次


Achilles Xu(29196159)  17:28:43
理解perl的面向对象,就是要理解bless和箭头符号。


尼摩船长(909129666)  17:29:01
那OO的其他特性呢?


Achilles Xu(29196159)  17:29:11
这里调用的时候写漏了,应该是: $x = Dog->new('Babby');


尼摩船长(909129666)  17:29:13
继承,封装什么的


weiwei(332003348)  17:29:14
第一个shift是 Dog,第一个是空
第二


Matthew(657196500)  17:29:58

这点我之前看过很多编了,印象是最深的


weiwei(332003348)  17:30:00
第一shif是包本身,是这么理解吧?


Matthew(657196500)  17:30:14
后边的就不行了


Achilles Xu(29196159)  17:30:47
继承就是包的继承机制,也就是: use base qw(Animal); 或者  @ISA = ('Animal');


Matthew(657196500)  17:31:01
dog->new
dog::new
区别大么


Achilles Xu(29196159)  17:31:23
@weiwei ,可以这么理解,关键是理解箭头符号补插参数的作用。

Achilles Xu(29196159)  17:33:20
@Mat ,区别很大,前面说过了。


weiwei(332003348)  17:33:33
关键是理解箭头符号补插参数的作用。

这里是指new的参数以hash的形式bless到packege里了,是指这个吗?


Achilles Xu(29196159)  17:34:07
不是。


Matthew(657196500)  17:34:09
经常在Perl的面向对象中看到这三种用法,有没有区别,是否可以根据喜好随意选择?
Cocoa::new() 
Cocoa->new() 
new Cocoa


尼摩船长(909129666)  17:34:28
第三种不被建议使用


Achilles Xu(29196159)  17:34:28
冒号那种肯定是不能替换后两者的。


Matthew(657196500)  17:35:13
第三种不被建议
第一种不能替换后两者
那么就只有第二种了


Achilles Xu(29196159)  17:35:20
Cocoa->new()   等于  Cocoa::new('Cocoa');      你们记好这个,还看不出区别吗?


CGI.NET(318274085)  17:35:25
Cocoa这种可以直接访问对象的方法


Matthew(657196500)  17:35:25
代码里还是比较容易看到第一种的


狂羽(369316748)  17:35:29
->能代替::吗 


CGI.NET(318274085)  17:35:40
而不用new


Achilles Xu(29196159)  17:35:47
Cocoa->new()   等于  Cocoa::new('Cocoa');    记住这个!


Matthew(657196500)  17:35:50
Cocoa->new()   等于  Cocoa::new('Cocoa');   
这个之前学习的时候,了解到了


Achilles Xu(29196159)  17:35:52
Cocoa->new()   等于  Cocoa::new('Cocoa');    记住这个!
Cocoa->new()   等于  Cocoa::new('Cocoa');    记住这个!
Cocoa->new()   等于  Cocoa::new('Cocoa');    记住这个!
强调一下,免得还有人问区别。


Matthew(657196500)  17:36:11
嗯,这个已经理解到了


CGI.NET(318274085)  17:36:24
这个 要看new的代码是怎么写的了


weiwei(332003348)  17:36:35
关键是理解箭头符号补插参数的作用。

那请问这个是指什么?没理解
Achilles Xu(29196159)  17:36:35
跟new的代码无关。


Matthew(657196500)  17:37:07
new代码,一般第一行,都是
my $self = shift;


Achilles Xu(29196159)  17:37:29
@mat ,一般new第一行不会是self的。
听就虚心听。


Matthew(657196500)  17:37:48


Achilles Xu(29196159)  17:38:01
方法的第一行才会用self
箭头左边有两种情况,一种是   Dog->new,左边是个包名,或者说是裸字符串。
另一种是 : $x->shout(...); 左边是个变量。


Achilles Xu(29196159)  17:39:10
左边是个变量的这种,要求变量必须是被bless过的,不然就会报错。

不管是这两种的哪种,左边的这个东西都会被作为插入到函数的第一个参数。


Achilles Xu(29196159)  17:40:35
$x->shout(...);  等于   Dog::shout($x, ...);   记住这个!!
$x->shout(...);  等于   Dog::shout($x, ...);   记住这个!!
$x->shout(...);  等于   Dog::shout($x, ...);   记住这个!!
$x->shout(...);  等于   Dog::shout($x, ...);   记住这个!!
$x->shout(...);  等于   Dog::shout($x, ...);   记住这个!!
上面强调要记住的这两条,你们记住,然后理解,就ok了。


扬眉剑(513428834)  17:44:30
$x->shout(...)的意思是激活shout这个子程序,然后把$x作为参数传递给shout这个子程序?
对吗?


Achilles Xu(29196159)  17:45:13
shout原来有多少程序还是照传,只是前面多插一个$x
所以在函数里经常看到用$self来接收第一个参数。其实$self和$x就是那个哈希啊。
纠正:shout原来有多少参数还是照传,只是前面多插一个$x


扬眉剑(513428834)  17:49:20
大家鼓掌感谢老许


Matthew(657196500)  17:49:26
感谢


Achilles Xu(29196159)  17:49:43
扬眉剑,你要注意我说的那两个强调里的“等于”这两个字。


尼摩船长(909129666)  17:49:47
谢谢!!!


Matthew(657196500)  17:49:49
我已经把重要信息,摘录到EverNote中了


Achilles Xu(29196159)  17:50:00
别搞其他神秘的,还激活什么的。
记住等于就行了,就是一个语法糖,简写法而已。


扬眉剑(513428834)  17:51:22
我貌似记住了吧


Matthew(657196500)  17:51:33
https://www.evernote.com/shard/s40/sh/86254a0e-a356-4648-94e1-619a46437113/2eb0abaf249e9cd78ea291d04f03ef84


扬眉剑(513428834)  17:51:36
我还要看书练习一下


Achilles Xu(29196159)  17:51:51
那就等于白说了,说明还是没懂。


Matthew(657196500)  17:51:51
整理出来的内容


Wy(2283522806)  17:52:27
 你能把xu哥的qq屏蔽了吗


扬眉剑(513428834)  17:52:43
等着我整理一个通俗易懂,附带练习的


weiwei(332003348)  17:52:46
那什么叫 继承?


扬眉剑(513428834)  17:52:53
先吃饭


尼摩船长(909129666)  17:53:03
先回家吃饭先。。


Matthew(657196500)  17:53:07
这点我已经懂了
面向对象这块我看了好多次,每次都是看明白一点,过段时间总是犯迷糊
不过老xu今天讲的这点已经明白了
其他的还犯迷糊


Achilles Xu(29196159)  17:53:23
继承就是父包的函数,子包也能调。


扬眉剑(513428834)  17:53:24
等着我的教程


尼摩船长(909129666)  17:53:31
Tie?
扬眉剑(513428834)  17:53:35
保准让大家都明白


Achilles Xu(29196159)  17:53:39
跟tie没关系。


尼摩船长(909129666)  17:53:46


北京-Kid(664009005)  17:53:54
我插,来晚了


尼摩船长(909129666)  17:54:04
我看得晕晕乎乎的
黑豹书的那两章


Achilles Xu(29196159)  17:54:36
可能讲的有点短,所以没有讲缘起。


AilesFX(727947255)  17:55:32
其实写写就知道了


Achilles Xu(29196159)  17:55:51
下次讲个一个小时的。




你可能感兴趣的:(老xu的Perl OO培训)