Original in russian: http://programmingmindstream.blogspot.ru/2014/08/blog-post_17.html
I’ll go back a long way, to C++ where there’s no operator with (and luckily never will be).
But there are “block variables” and the constructions like int & X = MyClass.MyField.MySubField;).
This strategy of the compiler is the RIGHT one.
If code could be compiled, what would we get?
We’d get this:
And so we get an “unexpected result”.
But! The compiler does not do so.
That is what we call a “reverse stability”.
And the operator with in Delphi does not have the “reverse stability”. It’s a pity.
Let me explain:
And in this way:
We’ll say: WOW!
One more thing…
How could we write in C++?
Do you understand why I wrote about the “block variables” and about &? Do you understand why “in this context” C++ does not need operator with.
I’ll go back a long way, to C++ where there’s no operator with (and luckily never will be).
But there are “block variables” and the constructions like int & X = MyClass.MyField.MySubField;).
Let the code be like:
class A { private: int X; // - this is a private member of A class };//A int X = 0; // - это глобальная переменная class B : A { void Dummy () { X = 123; // - here the compiler will grumble that “there is a private member // which can “shade” the global variable” }; };//B
As a result, the code will not be compiled.
How can it be compiled?
What if we try this one:
How can it be compiled?
What if we try this one:
class A { private: int X; // - this is a private member of A class };//A int X = 0; // - This is Global variable class B : A { void Dummy () { ::X = 123; // - here the compiler will not grumble because will “understands” // that X is a GLOBAL variable and ONLY X is }; };//B
This strategy of the compiler is the RIGHT one.
If code could be compiled, what would we get?
We’d get this:
class A { protected: int X; // - this is a “protected” member of A class };//A int X = 0; // - this is a global variable class B : A { void Dummy () { X = 123; // - WHY! Here X “suddenly” becomes a member of A class // and not a global variable }; };//B
And so we get an “unexpected result”.
But! The compiler does not do so.
That is what we call a “reverse stability”.
And the operator with in Delphi does not have the “reverse stability”. It’s a pity.
Let me explain:
type TA = class public Caption : String; end;//TA TB = class public Caption : String; A : TA; end;//TB ... procedure TB.SomeProc; begin with A do Caption := '123'; // - This is assigned to Self.A.Caption end;
And in this way:
Unit uA; ... type TA = class private Caption : String; end;//TA ... Unit uB; ... TB = class public Caption : String; A : TA; end;//TB ... procedure TB.SomeProc; begin with A do Caption := '123'; // - This is assigned to Self.A.Caption end;
We’ll say: WOW!
One more thing…
How could we write in C++?
void TB::SomeProc () { ... { ... std::string & vCap = A.Caption; vCap = '123'; ... } ... }
Do you understand why I wrote about the “block variables” and about &? Do you understand why “in this context” C++ does not need operator with.
Комментариев нет:
Отправить комментарий