class Frame
{
static int X;
static int Y;
static uint Color;
static protected bool Check()
{
return (Coords.GetPixelColor(X, Y) == Color);
}
}
class frameBeginning : Frame
{
static int X = 1;
static int Y = 2;
static int Color = 3;
}
frameBeginning.Check();
无法编译,因为Check()
由于其保护级别而无法访问。
但为什么,Check()
受到保护?
答案 0 :(得分:8)
这不是问题。您看到的行为是protected定义的一部分。如果要从frameBeginning或frame类的代码外部调用frameBeginning.Check,则该方法必须为public或internal。
答案 1 :(得分:4)
因为您在上面显示的代码中将其声明为受保护。
但是不同的规则适用于静态方法。看看下面的SO问题:
C#: Can a base class use a derived class's variable in a static function?
答案 2 :(得分:2)
您可以在 Check
内的中呼叫frameBeginning
,但不能在课堂外呼叫。这就是protected
的含义:派生类可见,而不是外部代码。
答案 3 :(得分:0)
使用来自外部的frameBeginning.Check()
需要Check()
是公开的。受保护只能由派生的clasess看到,但不能从外部看到。您正尝试从外部访问Check()
方法,因此您需要Check()
公开或内部。
换句话说,您可以从frameBeginning实例访问Check()
,但Check()
是静态的,如果您想从外部访问Check(),则需要将可见性更改为public(或内部)。
答案 4 :(得分:0)
因此,类本身和所有继承的类都可以使用该方法,而不依赖于对象的实例,但是类之外的任何东西都不能使用该方法。
答案 5 :(得分:0)
有5种访问修饰符......您需要了解每种修饰符可以获得哪种访问权限。
private
- 只能在类
protected
- 只能从类及其所有派生类中调用函数
internal protected
- 函数可以由类及其所有派生类调用程序集
internal
- 几乎像公众一样 - 可以从程序集内的任何地方调用...用于封装
public
- 可以从任何地方调用