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

时间:2016-07-02 10:48:47

标签: c# inheritance

如果我有这两个类

class Car
{
    public int maxSpeed;
}

class Minivan : Car
{
    maxSpeed = 100; //error

    public void Test() 
    {
        maxSpeed = 100;//ok!
    } 
}

为什么它只允许在一个方法而不是类体中使用基类的公共成员?

3 个答案:

答案 0 :(得分:4)

  

为什么只允许在一个方法而不是类体中使用基类的公共成员?

你正在考虑这个错误的方法。

辅助功能规则不会使此行为违法;无论可访问性如何,都是违法的。

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

同样,此规则没有任何与可访问性有关。它是您违反的语言的语法规则,而不是语义规则。

这应该回答你的问题,但让我们来看看你的代码。写这个的更好方法是:

file = open("item_index.txt", "r", encoding="utf8")
template = """\
{sk1}
{{
    "paint"  "{sk0}"
    "wear"   "0.000000000000000001"
    "quality" "3"
}}
"""
with open("config.cfg", "w") as config:
    config.write('"Paints"\n{\n')
    for skin in sorted(file):
        new_skin = skin.split(":")
        config.write(template.format(sk0=new_skin[0].strip(), sk1=new_skin[1].strip(), wear=wear)
    config.write("}")

为什么这样更好?

  • 公共领域是一个坏主意。将逻辑属性的内容表示为属性。
  • 该属性现在是只读的。你不希望任何人都能改变价值!
  • 使用良好的命名约定。
  • 汽车是抽象的,所以你不能创造一辆只是汽车的汽车。
  • 最大速度是“物理”数量,所以它应该是double,而不是int。没有要求将速度量化为整数。

答案 1 :(得分:0)

class Minivan : Car
{
maxSpeed=100; //error
}

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

如果要在子类中初始化基类的属性,可以使用constructor

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

如果您需要将maxSpeed的值传递给您创建的每辆汽车,您可以创建多个构造函数并chain them

答案 2 :(得分:0)

您在类中定义的是字段,您在方法中声明的是变量。它们可能看起来相同,但它们之间存在差异。就像你不能对变量使用访问修饰符,但你可以使用字段。字段和属性之间也存在狭缝差异,属性在类容器中公开标记为私有的字段。因此,您不能互换使用它们,这意味着您无法使用字段代替变量。在你的情况下,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; }
        }
    }

因此,如果你想使用该字段,请在方法或构造函数内或属性内使用它。希望它有所帮助。如果有任何疑问,请随时发表评论。

相关问题