protected
キーワードはメンバー アクセス修飾子です。
注
このページでは、 protected
アクセスについて説明します。
protected
キーワードは、protected internal
およびprivate protected
アクセス修飾子の一部でもあります。
保護されたメンバーは、そのクラス内および派生クラス インスタンスからアクセスできます。
protected
と他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。
例 1
基底クラスの保護されたメンバーは、派生クラス型を介してアクセスが行われる場合にのみ、派生クラスでアクセスできます。 たとえば、次のコード セグメントを考えてみます。
namespace Example1
{
class BaseClass
{
protected int myValue = 123;
}
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed through
// the derived class type, not through the base class type.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
}
このステートメント baseObject.myValue = 10
、基底クラス参照を介して保護されたメンバーにアクセスするため、エラーが生成されます (baseObject
は BaseClass
型です)。 保護されたメンバーには、派生クラス型または派生した型を介してのみアクセスできます。
private protected
とは異なり、protected
アクセス修飾子を使用すると、任意のアセンブリ内の派生クラスからアクセスできます。
protected internal
とは異なり、同じアセンブリ内の非派生クラスからのアクセスは許可されません。
構造体を継承できないため、構造体メンバーを保護できません。
例 2
この例では、 DerivedPoint
クラスは Point
から派生しています。 したがって、基底クラスの保護されたメンバーには、派生クラスから直接アクセスできます。
namespace Example2
{
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
var dpoint = new DerivedPoint();
// Direct access to protected members.
dpoint.x = 10;
dpoint.y = 15;
Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
}
}
// Output: x = 10, y = 15
}
x
とy
のアクセス レベルをプライベートに変更すると、コンパイラによってエラー メッセージが発行されます。
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
アセンブリ間アクセス
次の例は、 protected
メンバーが異なるアセンブリ内にある場合でも、派生クラスからアクセス可能であることを示しています。
// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
public class BaseClass
{
protected int myValue = 0;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
using Assembly1;
class DerivedClass : BaseClass
{
void Access()
{
// OK, because protected members are accessible from
// derived classes in any assembly
myValue = 10;
}
}
}
このアセンブリ間のアクセシビリティは、 protected
を private protected
(同じアセンブリへのアクセスを制限する) と区別しますが、 protected internal
に似ています (ただし、 protected internal
では、派生していないクラスからの同じアセンブリ アクセスも許可されます)。
C# 言語仕様
詳細については、「C# 言語仕様で宣言されたアクセシビリティ」を参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
こちらも参照ください
.NET