*final* class member (D2)
Neil Vice
sardonicpresence at gmail.com
Wed Feb 13 20:52:02 PST 2008
"Denton Cockburn" <diboss at hotmail.com> wrote in message
news:pan.2008.02.14.00.52.40.389590 at hotmail.com...
> On Thu, 14 Feb 2008 08:53:23 +0900, Neil Vice wrote:
>
>>
>> "Denton Cockburn" <diboss at hotmail.com> wrote in message
>> news:pan.2008.02.13.22.55.38.263151 at hotmail.com...
>>> On Wed, 13 Feb 2008 14:33:33 -0500, Steven Schveighoffer wrote:
>>>
>>>> "Denton Cockburn" wrote
>>>>> How do I do this? I'm trying to create a class member here that needs
>>>>> to
>>>>> be initialized in the constructor, but cannot be changed later.
>>>>>
>>>>> class A
>>>>> {
>>>>> (const doesn't work) real delegate() dg; // this is that
>>>>> function;
>>>>>
>>>>> this(real delegate() dg) { this.dg = dg; }
>>>>> }
>>>>>
>>>>> class B
>>>>> {
>>>>> real foo() { return 3.5; }
>>>>> }
>>>>>
>>>>> class C
>>>>> {
>>>>> real foo() { return 4.5; }
>>>>> }
>>>>>
>>>>> void main()
>>>>> {
>>>>> auto b = new B;
>>>>> auto a = new A(&b.foo);
>>>>> auto c = new C;
>>>>> a.fitness = &c.foo; // I want this to be an error
>>>>> }
>>>>
>>>> um... did you try encapsulation?
>>>>
>>>> class A
>>>> {
>>>> private real delegate() _dg;
>>>>
>>>> public real dg()
>>>> {
>>>> return _dg();
>>>> }
>>>>
>>>> this(real delegate() dg) { this._dg = dg; }
>>>> }
>>>>
>>>> -Steve
>>>
>>> This was the workaround I used as well.
>>> I don't like it because of the extra level of indirection (I end up
>>> calling 2 functions instead of 1). I don't consider this very efficient
>>> or convenient.
>>
>> I would have expected the dg() method (or property I guess) in the above
>> to
>> be inlined, possibly requiring a final specifier? In that case I don't
>> see
>> any reduction in performance.
>>
>> As a matter of interest the following code is fairly equivalent but
>> results
>> in some bizarre property/delegate interaction:
>>
>> class A
>> {
>> private real delegate() _dg;
>>
>> this(real delegate() dg) { this._dg = dg; }
>>
>> public real delegate() dg()
>> {
>> return _dg;
>> }
>> }
>>
>> // Sample usage
>> public void example(real delegate() dg)
>> {
>> A test = new A(dg);
>> // test.dg - Evaluates to the delegate dg
>> // test.dg() - Also evaluates to the delegate dg
>> test.dg()() // Required to actually execute the delegate
>> }
>>
>> Neil
>
> isn't that because you have the function (test.dg) return a "real
> delegate()" so: test.dg() returns a delegate, and test.dg()() calls that
> delegate.
Yes, however by similar logic one could conclude that because the property
"test.dg" returns a "real delegate()" that "test.dg()" should execute the
delegate and return a real.
More information about the Digitalmars-d-learn
mailing list