class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
otherTestClass._privateString
このコードは C# でコンパイルされ、同等のものが PHP で動作しますが、ここで変更できる理由を誰かが説明できますか?
クラスのインスタンスは、どのような状況でもプライベートメンバー変数を変更できないはずであり、アクセスしようとするとotherTestClass._privateString
「保護レベルのためにアクセスできません」というエラーが発生すると考えていました。
ただし、そうではないのに、オブジェクトを独自のクラス内でインスタンス化すると、プライベート メンバーにアクセスできるようになるのはなぜでしょうか? そして、これはカプセル化をある程度壊しませんか?それとも明らかな何かが欠けていますか?
- (上記のクラスの設計が良い方法であるかどうかを尋ねているのではなく、その背後にある理論について疑問に思っているだけです。)
編集- 回答とコメントをありがとう。明確にするために、これを実行できることが肯定的な機能と見なされるかどうか、またはコンパイル時のチェック/コードの明確さ/他のほとんどの言語がそのように行うため、それが必要なトレードオフであるかどうかも知りたいです。理想的には、コンパイラがこれを防止または警告するように思えますが、そうなると、私は言語設計者とはほど遠いものになります。このようにすることで、(カプセル化に違反することなく)何か便利なことを行うことができる方法の例は、そうでなければ困難または不可能になるでしょう。