看了几天oo 还是似懂非懂 请帮忙解释一下构造器 sub new

看了几天oo 还是似懂非懂 请帮忙解释一下构造器 sub new

刚刚接触oo 问的问题可能很幼稚 请不吝赐教
code1.

[Copy to clipboard] [ - ]
CODE:
       sub new {
                my $self = {};
                bless $self;
                return $self;
        }

code2.

[Copy to clipboard] [ - ]
CODE:
sub new {
            my $class = shift;
            my $self = {};
            bless $self, $class;
           return $self;
        }

1。这里面的 $class = shift;   表示什么?
2。code2. 里面bless 两个变量$self 和 $class   在实际构造的时候 和code1.有什么区别 ?

能给举个例子  详细解释一下吗?  不胜感激

>1。这里面的 $class = shift;   表示什么?
shift @_ 的简写,把第1个传入的数据副给$class

第2个不知道,不懂oo


QUOTE:
原帖由 hitsubunnu 于 2008-2-14 17:01 发表
刚刚接触oo 问的问题可能很幼稚 请不吝赐教
code1.

       sub new {
                my $self = {};
                bless $self;
                return $self;
        }

code2.

sub new { ...

回答
1.$class = shift;
对于一个class,第一个参数是class name
所以$class = shift 得到的就是class的名字
对于一个instance,第一个参数是instance name


具体的可以参见intermediate perl里面的这一段说明

QUOTE:
The invocation of:
Class->method(@args)
attempts to invoke the subroutine Class::method as:
Class::method('Class', @args);



QUOTE:
The method arrow can be used on instances, as well as names of packages (classes). Let's get the sound that $tv_horse makes:
my $noise = $tv_horse->sound;
To invoke sound, Perl first notes that $tv_horse is a blessed reference, and thus an instance. Perl then constructs an argument list, similar to the way an argument list was constructed when you used the method arrow with a class name. In this case, it'll be just ($tv_horse). (Later you'll see that arguments will take their place following the instance variable, just as with classes.)
Now for the fun part: Perl takes the class in which the instance was blessed, in this case Horse, and uses it to locate the subroutine to invoke the method, as if you had said Horse->sound instead of $tv_horse->sound. The purpose of the original blessing is to associate a class with that reference to allow the proper method (subroutine) to be found.
In this case, Horse::sound is found directly (without using inheritance), yielding the final subroutine invocation:
Horse::sound($tv_horse)
Note that the first parameter here is still the instance, not the name of the class as before. neigh is the return value, which ends up as the earlier $noise variable.

2.两段code是一样的

[Copy to clipboard] [ - ]
CODE:
perldoc -f bless

bless REF,CLASSNAME
       bless REF
               This function tells the thingy referenced by REF that it is now
               an object in the CLASSNAME package.  If CLASSNAME is omitted,
               the current package is used.  Because a "bless" is often the
               last thing in a constructor, it returns the reference for con‐
               venience.  Always use the two-argument version if a derived
               class might inherit the function doing the blessing.  See perl‐
               toot and perlobj for more about the blessing (and blessings) of
               objects.

               Consider always blessing objects in CLASSNAMEs that are mixed
               case.  Namespaces with all lowercase names are considered
               reserved for Perl pragmata.  Builtin types have all uppercase
               names. To prevent confusion, you may wish to avoid such package
               names as well.  Make sure that CLASSNAME is a true value.

               See "Perl Modules" in perlmod.


QUOTE:
原帖由 churchmice 于 2008-2-14 21:04 发表



回答
1.$class = shift;
对于一个class,第一个参数是class name
所以$class = shift 得到的就是class的名字
对于一个instance,第一个参数是instance name


具体的可以参见intermediate perl里面的 ...

非常感谢

不知道 能不能 麻烦用中文解释一下, 我本身是学日语的 英文的文档实在是看不懂

关于第2个问题 我怎么总是觉得 bless $self,$class 和 bless $self 会有所区别 可能是我还没有真的理解

两段代码事实上是有区别的。

2号 的更通用,有可继承性。
1号 的不行。



QUOTE:
原帖由 cobrawgl 于 2008-2-15 09:27 发表
两段代码事实上是有区别的。

2号 的更通用,有可继承性。
1号 的不行。

谢谢  

看了下面这个 有点儿明白了  

[Copy to clipboard] [ - ]
CODE:
sub new {
        my $invocant = shift;
        my $class = ref($invocant) || $invocant;
        my $self = { @_ };         # 剩下的参数变成属性
        bless($self, $class);         # 给予对象性质
        return $self;
}



QUOTE:
原帖由 cobrawgl 于 2008-2-15 09:27 发表
两段代码事实上是有区别的。

2号 的更通用,有可继承性。
1号 的不行。


没有想到这一层