为什么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成员而不允许在类体中使用?
为什么只允许在方法中使用基类的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; }
}
}
所以如果你想使用这个字段,可以在方法或构造函数或属性中使用它。希望能有所帮助。如有任何疑问,请随时提出意见。