Is it a bug that a parent class that access its own private members from derived classes gets deprecation warning?

martin martin at mab-on.net
Mon Apr 9 17:05:45 UTC 2018


On Sunday, 8 April 2018 at 13:00:02 UTC, bauss wrote:
> I think it's better demonstrated like this, because to me the 
> behavior makes no sense.
>
> Especially since you can just cast "Bar" to "Foo" and then 
> you're allowed to do it.
>
> Since we're inside Foo then it shouldn't care whether "_baz" is 
> private or not.
>
> I could understand if the function was located within Bar, but 
> it's not.
>
> It's perfectly normal in other languages that supports classes 
> to access private members of parent's as long as you're within 
> the parent's encapsulation.
>
> // a.d
> module a;
>
> class Foo
> {
> 	private:
> 	bool _baz;
> 	
> 	public:
> 	void handleBar(T : Foo)(T[] foos)
> 	{
> 		foreach (child; foos)
> 		{
> 			child._baz = true; // Not ok.
> 			(cast(Foo)child)._baz = true; // Ok.
> 		}
> 	}
> }
>
> // b.d
> module b;
>
> import a;
>
> class Bar : Foo
> {
> 	
> }
>
> // main.d
>
> module main;
>
> import b;
>
> void main()
> {
> 	auto bars = [new Bar, new Bar];
> 	auto bar = new Bar;
> 	bar.handleBar(bars);
> }

Actually, this behaves as i would expect.
`_baz` is a private member of Foo (to be precise: it belongs to 
module `a`)
in handleBar(), you iterate `Bar[]` - which is in module `b`.
By casting it to Foo, you are accessing the wanted module (`a`) 
again.



More information about the Digitalmars-d mailing list