partial class

Sergey Gromov snake.scaly at gmail.com
Fri Nov 7 10:00:10 PST 2008


Fri, 31 Oct 2008 21:39:42 +0300, Denis Koroskin wrote:

> On Fri, 31 Oct 2008 20:59:23 +0300, KennyTM~ <kennytm at gmail.com> wrote:
> 
>> Denis Koroskin wrote:
>>> On Fri, 31 Oct 2008 20:06:42 +0300, KennyTM~ <kennytm at gmail.com> wrote:
>>>
>>>> Denis Koroskin wrote:
>>>>> On Fri, 31 Oct 2008 17:37:42 +0300, Mike James <foo at bar.com> wrote:
>>>>>
>>>>>> Not sure if this has been suggested before as an addition to D but  
>>>>>> what about introducing a partial class as per C# - with all the  
>>>>>> benefits it would bring...
>>>>>>
>>>>>> -=mike=-
>>>>>   I must be missing something, but D already supports defining class  
>>>>> methods in one file and implementing them in another one.
>>>>
>>>> Something like this:
>>>>
>>>>
>>>> partial class A {
>>>>      int someMember;
>>>>      public A(int x) { someMember = x; }
>>>> }
>>>>
>>>> // Far, far apart
>>>>
>>>> partial class A {
>>>>      public int getSomeMember() { return someMember; }
>>>> }
>>>>
>>>>
>>>> class X {
>>>>      static void Main() {
>>>>          var someA = new A(12);
>>>>          System.Console.WriteLine(someA.getSomeMember());
>>>>      }
>>>> }
>>>  Is this worth the trouble? You can have
>>>  class A {
>>>     int someMember;
>>>     public A(int x) { someMember = x; }
>>>     public int getSomeMember();
>>> }
>>>  in one module and implement getSomeMember() in another module. I  
>>> believe all the class methods should be defined in one place so that  
>>> user don't need to import class definition from multiple places. This  
>>> also makes semantic analysis more complex.
>>
>> Right. It may be useful when you want to provide additional function,  
>> e.g. a getRandom method to a NormalDistribution class where normally  
>> that function would not be needed.
>>
>>    module math.normaldistrib;
>>
>>    partial class NormalDistribution : IDistribution {
>>      double mean() { ... }
>>      double stdev() { ... }
>>      // etc.
>>    }
>>
>> in another module:
>>
>>    module random.normal;
>>
>>    partial class NormalDistribution : IRandomGenerator {
>>      double getRandom() {
>>        // complete something the math. package's author
>>        // don't bother to do.
>>        ...
>>      }
>>    }
>>
>> But again I said this can be solved with equating a.method(b) to  
>> method(a,b), which has been in the TODO list long long time ago.
>>
>>    double getRandom(NormalDistribution nd) {
>>      // a catch: you can't access private members here.
>>      ...
>>    }
>>
>> .NET uses partial class to separate generated UI code and custom UI  
>> code, though subclassing the UI look and do the implementation in that  
>> subclass also solves the problem. (Qt works in this way.)
> 
> Note that partial classes also compromise code security:
> 
> partial class Foo
> {
>      private int secret;
> }
> 
> // HA-HA-HACK!
> partial class Foo
> {
>      int hack() { return secret; }
> }
> 
> I wouldn't trust these.

C++ and D are not Java.  You cannot base any security upon member access
attributes because any member is accessible via a minimal amount of
pointer magic.  But, with partial classes, you can definitely kiss
goodbye to encapsulation.



More information about the Digitalmars-d mailing list