为什么parent'的public成员只能在方法定义中访问,而不能在从它派生的类中访问?

本文关键字:访问 不能 派生 方法 parent public 成员 为什么 定义 | 更新日期: 2023-09-27 17:54:17

如果我有这两个类

class Car
{
    public int maxSpeed;
}
class Minivan : Car
{
    maxSpeed = 100; //error
    public void Test() 
    {
        maxSpeed = 100;//ok!
    } 
}

为什么只允许在方法中使用基类的public成员而不允许在类体中使用?

为什么parent'的public成员只能在方法定义中访问,而不能在从它派生的类中访问?

为什么只允许在方法中使用基类的public成员,而不允许在类体中使用?

你想错了。

并不是可访问性规则使得这是非法的;不管可访问性如何,这都是非法的。

你违反的规则是语句必须出现在方法、属性、构造函数、析构函数、索引器、操作符或事件的主体中。在第一个代码示例中,该语句出现在所有这些代码示例之外,而在第二个代码示例中,它出现在一个方法中。

同样,该规则与无关与可访问性无关。你违反的是语言的语法规则,而不是语义规则。

这应该可以回答您的问题,但是让我们看一下您的代码。更好的写法是:

abstract class Car 
{
  public abstract double MaximumSpeed { get; } 
}
class Minivan : Car 
{
  public override double MaximumSpeed { get { return 100.0; } }
}

为什么这样更好?

  • 公共字段是一个坏主意。将逻辑上属于属性的事物表示为属性。
  • 属性现在是只读的。您不希望任何人都能够更改该值!
  • 使用良好的命名约定。
  • Car是抽象的,所以你不能创建一个仅仅是汽车的车辆。
  • 最大速度是一个"物理"量,所以它应该是双倍的,而不是整型。没有要求将速度量化为整数。
class Minivan : Car
{
maxSpeed=100; //error
}

不适合任何地方,它不是类的成员,它甚至没有类型。这是什么?

如果你想在子类中初始化基类的属性,你可以使用构造函数。

class Car
{
    Car()
    {
        maxSpeed = 100;
    }
}

如果你需要将maxSpeed的值传递给你创建的每辆车,你可以创建多个构造函数并将它们链接起来

在类中定义的是字段,在方法中声明的是变量。他们可能看起来一样,但他们之间有区别。比如不能对变量使用访问修饰符,但可以对字段使用。此外,字段和属性之间也有细微的区别,属性在容器(如class)中公开标记为私有的字段。所以你不能互换使用它们,这意味着你不能用字段代替变量。在您的例子中,maxspeed是一个字段,您将它用作变量。

class Minivan : Car
    {
        //Inside a method
        public void Test()
        {
            maxSpeed = 100;
        }
        //Inside a constructor 
        public Minivan(int _maxSpeed)
        {
            maxSpeed = _maxSpeed;
        }
        //Inside a property
        public int MaxSpeed
        {
            get { return maxSpeed; }
            set { maxSpeed = value; }
        }
    }

所以如果你想使用这个字段,可以在方法或构造函数或属性中使用它。希望能有所帮助。如有任何疑问,请随时提出意见。