*final* class member (D2)

Denton Cockburn diboss at hotmail.com
Wed Feb 13 16:52:44 PST 2008


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.



More information about the Digitalmars-d-learn mailing list