On Fri, Sep 01, 2000 at 12:20:34PM +0100, Hildo Biersma wrote:
> Michael Fowler wrote:
> > 
> > On Fri, Sep 01, 2000 at 08:31:17AM +0100, Hildo Biersma wrote:
> > > My previous concerns have not been adressed:
> > > - There may not be a default constructor
> > 
> > If there is no implicit constructor method defined by the class, and the my
> > Dog $spot syntax is used, a fatal exception is raised.  The RFC mentions
> > this.  This exact thing is also currently being discussed.
> 
> In OO vocabulary, a 'default constructor' is one that has been declared
> to take no arguments.  If a class defines a constructor that requiers
> arguments, it cannot be called implicitly.

This is not true.  In C++, if a class constructor that requires a single
argument is defined, and without the keyword explicit, it can be called
implicitly in type conversions.

However, I fail to see how this definition of 'default constructor' makes it
a requirement that there be one.  There must be one for my Dog $spot to not
raise a fatal exception, but if it's not defined and my Dog $spot is never
used, there is no requirement that there be an implicit constructor.

 
> > > - This makes creations of Singleton classes impossible
> > 
> > In what way?  The implicit constructor method can return anything it likes,
> > just as current constructors can.
> 
> Singleton classes can have a private constructor, and a class method
> that conditionally invokes the constructor _once_, then re-uses the
> reference when this makes sense.  That does not make the class method
> the constructor - and there might be multiple, different, of these class
> methods.

my Dog $spot does not preclude the use of explicit constructors.  All it
does is call a constructor implicitly.  I guess I still fail to see how this
makes singleton classes any less possible than current Perl makes them.


> > 
> > > - There is a good reason to created typed, but undef, references
> > >   and fill them in later.
> > 
> > What is this reason?  Can you give some examples?
> 
> You need to be able to create a scoped and typed object reference that
> starts out undefined, then is filled in depending on various arguments,
> and then is used safely afterwards.
> 
> sub BuyDog {
>     my ($budget, $age) = @_;
> 
>     my Dog $retval;
>     if ($budget > 100) {
>        $retval = ExpensiveDog->new( ---- blabla ---);
>     } elsif ($age > 12) {
>        $retval = BigDog->new(--- blabla ---);
>     } else {
>        $retval = MangyDog->new(--- blabla ---);
>     }
>     $retval->feed();
>     fill_in_forms($retval);
>     return $retval;
> }
> 
> >  Could such a thing fit
> > cleanly and unambiguously in with the rest of this idea?  If so, do you have
> > an idea how?
> 
> I think not - creating objects implicitly is *wrong*, unless we start to
> allow creating Objects on the stack, such as C++ does.

Well, I've been giving examples of using:

    my $spot isa(Dog);

today.  This does fit cleanly and unambiguously.

As for creating objects implicitly, this doesn't do that.  The constructor
is called implicitly, the my Dog $spot syntax is fairly explicit.


> > >
> > > Based on my C++ experience, this should only be allowed if the
> > > constructor has been marked as 'implicit construction safe'.
> > 
> > It is assumed that the method is "implicit construction safe", if by that
> > you mean suitable to be called implicitly to construct an object.  Since the
> > methods are uniquely named, or specified by the author, I don't think this
> > is assuming too much.
> 
> Let me reiterate.  One of the issues in C++ is that
> 
>   Dog spot = 5;
> 
> means 
>   
>   Dog spot = Dog(5);

Actually, it's:

    Dog spot;
    spot.overload=(5);

assuming there's an operator=(int) defined.  If there's only a Dog(int)
defined, and an operator=(Dog), then yes, the 5 is implictly converted.

I am not proposing we implement implicit conversions.

 
> Merely naming a method as a constructor does not mean implicit object
> creation is a good idea.  Creating objects can be quite expensive, and
> one of the biggest drags on program performance is unexpected object
> creation.

Is getting an object out of my Dog $spot unexpected?  What about if you were
to forget what my Dog $spot means currently?


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

Reply via email to