From: Lew on 12 Feb 2010 21:50 Pidgeot18(a)verizon.invalid How come you don't use the handle for citations, but the email address? I know that "pee-djyo" means "beer" in Mandarin, but I really, really had to work to figure out that you were quoting Joshua Cranmer, who > says... >> Even C++ requires that superconstructors be called before the >> constructor executes (although it does permit you to wrap the whole >> initializer in a try-catch block, which was incidentally the feature >> that originally prompted this IIRC). Pitch wrote: > I belive Java picked it up from C. Picked what up? Not constructors, surely. Joshua: >> I can't think of a language which treats constructors as regular >> methods. Pitch wrote: > Delphi has virtual constructors but bas class TObject has a non-virtual > empty destructor which you cannot override. That doesn't say that Delphi (i.e., Pascal, right?) treats constructors as regular methods. Does it? > In the other thread I mentioned some .NET languages have this rule, but > some don't like VB.NET, and the compiled code is interchangeable. It is > perfectly ok to use a class with such loose constructor in C# e.g. That doesn't say that those .NET languages treat constructors as regular methods. Do they? Joshua: >> It is a very sensible restriction, and the expectation by programmers >> coming from other languages is that it will be. Constructors have the >> notion of actually reserving the memory space and then initializing it >> at the same time--hence we have the `new' keyword and the actual >> constructor call. If you were to separate the memory space reservation >> and initialization out, then it would make sense to allow constructors >> to be called multiple times. But Java doesn't allow you to do so, so the >> point is moot. Pitch wrote: > I belive we have three steps in object construction: memory allocation > (new), member initialization, and constructor body execution. Keyword > new is also used in allocating structures bz name or by a pointer. Java? > I can also add that memory allocation means the object is alive at that > moment we have a refetence to this. After is only language specific > implementation. -- Lew
From: Mike Schilling on 12 Feb 2010 22:30 Pitch wrote: > In article <hl4729$j8s$1(a)news.eternal-september.org>, > mscottschilling(a)hotmail.com says... >> >> Pitch wrote: >>> In article <hl1ban$hes$1(a)news.eternal-september.org>, >>> mscottschilling(a)hotmail.com says... >>>> >>>> Pitch wrote: >>>>> In article <hkvi82$usn$1(a)news.eternal-september.org>, >>>>> mscottschilling(a)hotmail.com says... >>>>>> >>>>>> Suppose the call to "super()" needn't be the first line of a >>>>>> constructor. Discuss the effect and/or legality of the following >>>>>> code: >>>>>> >>>>>> class MyClass extends YourClass >>>>>> { >>>>>> public MyClass(int i) >>>>>> { >>>>>> if ( i > 0) >>>>>> { >>>>>> super(i); >>>>>> } >>>>>> } >>>>>> ... >>>>> >>>>> If you look at super() as just another method call it's perfectly >>>>> ok. >>>> >>>> But it isn't "just another method call", which is the point of the >>>> example. It's the call that guarantees that the superclass, >>>> starting from a completely uninitialized state, has been fully >>>> initialized. It needs to be called precisely once, and that needs >>>> to be done before any instance methods are called or instance >>>> fields accessed. >>> >>> >>> I though we are talking about changes in the language so it doesn't >>> mater if it's not a method right now, or if it's allowed only once >>> to be called. If we are talking of possible changes to Java it >>> could be just another method and it could be called more than once, >>> ok? >>> >>> In that case your example works perfectly ok. >> >> As I explained above, it breaks all guarantees about class >> construction. That's a bad thing. > > Well, I keep talking hypothetically and you keep sticking with Java. > Nevermind. I would have said that I keep explaining that conventions and rules are important for keeping software comprehensible and reliable, and you keep saying "but that gets in the way of hacking".
From: Tom Anderson on 13 Feb 2010 08:03
On Fri, 12 Feb 2010, Joshua Cranmer wrote: > On 02/12/2010 09:59 AM, Pitch wrote: >> In article<U5mdnVQN4rmk9ejWnZ2dnUVZ_qSdnZ2d(a)earthlink.com>, >> pats(a)acm.org says... >>> >>> Pitch wrote: >>> ... >>>> I though we are talking about changes in the language so it doesn't >>>> mater if it's not a method right now, or if it's allowed only once to be >>>> called. If we are talking of possible changes to Java it could be just >>>> another method and it could be called more than once, ok? >>> ... >>> >>> That would be the most dangerous possible type of change to the >>> language, one that changes the semantics of existing syntax. >> >> Of course. I don't think this can be changed, I just want people to >> agree this restricton should have not be introduced at all. > > Even C++ requires that superconstructors be called before the constructor > executes (although it does permit you to wrap the whole initializer in a > try-catch block, which was incidentally the feature that originally prompted > this IIRC). > > I can't think of a language which treats constructors as regular > methods. C++ lists it as a "special member function", it's one of two > special functions in Java (the other being, essentially, <clinit>). I > think python also treats it specially as well. I can't think of anything special about it in python. Consider: Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> class Foo(object): .... def __init__(self, bar): .... self.bar = bar .... >>> f = Foo(23) >>> f.bar 23 >>> f.__init__(17) >>> f.bar 17 >>> class Bar(Foo): .... def __init__(self, qux): .... self.qux = qux .... >>> b = Bar("fnord!") >>> b.qux 'fnord!' >>> b.bar Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Bar' object has no attribute 'bar' That is, you can call an __init__ method on an already-constructed object, and construction doesn't implicitly call the superclass __init__. There's the special semi-magic super function (actually, a class) that you have to use if you want to invoke a superclass __init__ function. I suppose the subtlety is that __init__ isn't a constructor - it's an initialisation method. It gets called by the construction code, but it's just a normal function itself. tom -- First man to add a mixer get a shoeing! -- The Laird |