【问题标题】:OO Problem in C#C#中的OO问题
【发布时间】:2011-01-03 15:24:33
【问题描述】:
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() 受到保护?

【问题讨论】:

  • 大小是正确的。顺便说一句,您应该使用编码标准。通常,类以大写字母开头。如果你不喜欢这样,至少在所有地方都保持一致(Frame vs frameBeginning)。

标签: c# oop


【解决方案1】:

这不是问题。您看到的行为是protected 定义的一部分。如果要在frameBeginning或frame类的代码之外调用frameBeginning.Check,方法需要为publicinternal

【讨论】:

    【解决方案2】:

    因为您在上面显示的代码中将其声明为受保护。

    但不同的规则适用于静态方法。查看下面的 SO 问题:

    C#: Can a base class use a derived class's variable in a static function?

    【讨论】:

      【解决方案3】:

      您可以在 frameBeginning 中致电Check,但不能在课堂外致电。这就是protected 的意思:对派生类可见,对外部代码不可见。

      【讨论】:

        【解决方案4】:

        从外部使用frameBeginning.Check() 需要Check() 是公开的。受保护仅对派生类可见,而对外部类不可见。您正在尝试从外部访问 Check() 方法,因此您需要执行 Check() public 或 internal。

        换句话说,您可以从 frameBeginning 实例访问 Check(),但 Check() 是静态的,如果您想从外部访问 Check(),则需要将可见性更改为公共(或内部)。

        【讨论】:

          【解决方案5】:

          这样类本身和所有继承的类都可以使用方法,独立于对象的实例,但类之外的任何东西都不能使用方法。

          【讨论】:

            【解决方案6】:

            有 5 种访问修饰符...您需要了解每种访问修饰符可以获得什么样的访问权限。

            private - 函数只能在类中调用

            protected - 只能从类及其所有派生类中调用函数

            internal protected - Assembly 中的类及其所有派生类都可以调用函数

            internal - 几乎像 public - 可以从 Assembly 内的任何地方调用...用于封装

            public - 可以从任何地方调用

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-10-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多