簡単に言えば、インスタンスの保護されたメンバーへのアクセスは、派生クラス内からアクセスしようとしても、パブリック アクセスと見なされます。したがって、それは否定されます。
あちこちに多くの答えがありますが、「子から親クラスの保護されたメンバーにアクセスできない理由」を明確にするものはありませんでした。上記は、これらの紛らわしい回答を読んだ後、コードをもう一度見て理解したものです。
例:
class Parent
{
protected int foo = 0;
}
// Child extends from Parent
class Child : Parent
{
public void SomeThing(Parent p)
{
// Here we're trying to access an instance's protected member.
// So doing this...
var foo = p.foo;
}
}
// (this class has nothing to do with the previous ones)
class SomeoneElse
{
public void SomeThing(Parent p)
{
// ...is the same as doing this (i.e. public access).
var foo = p.foo++;
}
}
p.foo
子クラス内にいるのでアクセスできると思うかもしれませんが、インスタンスからアクセスしていて、それはパブリック アクセスのようなものなので、拒否されます。
インスタンスからではなく、クラス内からメンバーにアクセスできprotected
ます (はい、これはわかっています)。
class Child : Parent
{
public void SomeThing()
{
// I'm allowed to modify parent's protected foo because I'm
// doing so from within the class.
foo++;
}
}
最後に、完全を期すために、同じクラス内でアクセスしている場合にのみ、実際にはインスタンスprotected
やメンバーにさえアクセスできます。private
class Parent
{
protected int foo = 0;
private int bar = 0;
public void SomeThing(Parent p)
{
// I'm allowed to access an instance's protected and private
// members because I'm within Parent accessing a Parent instance
var foo = p.foo;
p.bar = 3;
}
}