C# 继承-练习

C# 继承-练习,c#,C#,好的,我正在学习继承,我做了一些事情,这是代码: class array { int [] arr; public array(int[] arr) { this.arr = arr; } public int Biggest() { return arr.Max(); } public int Min() { return arr.Min(); } publi

好的,我正在学习继承,我做了一些事情,这是代码:

class array
{
    int [] arr;
    public array(int[] arr)
    {
        this.arr = arr;
    }
    public int Biggest()
    {
        return arr.Max();
    }
    public int Min()
    {
        return arr.Min();
    }
    public int SumArr()
    {
        return arr.Sum();
    }
}
class array2 : array
{
    public array2(int [] arr):base(arr)
    {
    }
    public double Average()
    {
        return 
    }
}
现在,在派生类中,我需要获得数组的平均值,但我不能执行arr.average() 错误显示:
error 1'ConsoleApplication1.array.arr'由于其保护级别为C:\Users\x\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 35 20 ConsoleApplication1,因此无法访问
谁能告诉我我做错了什么?
谢谢你的帮助

将public或protected添加到arr变量:

public int [] arr; 
protected int [] arr; 

如果不另行指定,编译器将默认将声明设置为私有

将public或protected添加到arr变量:

public int [] arr; 
protected int [] arr; 

如果不另行指定,编译器将默认将声明设置为私有

arr被声明为私有,因为您没有指定可见性类型。如果将其更改为受保护,则子类array2将能够访问它

protected int [] arr;

由于未指定可见性类型,arr被声明为私有。如果将其更改为受保护,则子类array2将能够访问它

protected int [] arr;

由于您没有显式定义arr的访问类型,因此它被隐式设置为private。为了能够从派生类访问该类,应该将其设置为protected

protected int [] arr;

有更好的方法可以做到这一点,例如通过属性,但这是一般的想法。

因为您没有明确定义arr的访问类型,所以它被隐式设置为private。为了能够从派生类访问该类,应该将其设置为protected

protected int [] arr;

有更好的方法可以做到这一点,例如通过属性,但这是一般的想法。

在C#中,类成员的默认访问级别是
private
。您尚未为
int[]arr
指定访问级别,因此它是
private
,因此对其他类可见。

在C#中,类成员的默认访问级别是
private
。您尚未为
int[]arr
指定访问级别,因此它是
private
,因此对其他类可见。

这是因为您的arr字段是private。考虑使用一个写私有读保护的属性,像这样:

class array
{
    protected int[] arr {get; private set; }
    public array(int[] arr)
    {
        this.arr = arr;
    }
    public int Biggest()
    {
        return arr.Max();
    }
    public int Min()
    {
        return arr.Min();
    }
    public int SumArr()
    {
        return arr.Sum();
    }
}
class array2 : array
{
     public array2(int [] arr):base(arr)
     {
     }
     public double Average()
     {
        return arr.Average();
     }
}

这是因为您的arr字段是私有的。考虑使用一个写私有读保护的属性,像这样:

class array
{
    protected int[] arr {get; private set; }
    public array(int[] arr)
    {
        this.arr = arr;
    }
    public int Biggest()
    {
        return arr.Max();
    }
    public int Min()
    {
        return arr.Min();
    }
    public int SumArr()
    {
        return arr.Sum();
    }
}
class array2 : array
{
     public array2(int [] arr):base(arr)
     {
     }
     public double Average()
     {
        return arr.Average();
     }
}

在您的示例中,您将
arr
数组隐式地
private
,其中省略了修饰符本身。如果您想提供对派生类中所述
字段的访问,则需要使用
protected
的访问修饰符:

protected int[] arr;
但是不建议以这种方式公开字段,因为字段实际上应该用于私有类状态。您应该做的是通过属性封装对该字段的只读访问:

protected int[] Array { 
    get { return this.arr; }
}
这意味着在派生类中,您可以:

public double Average()
{
    return this.Array.Average();
}

在您的示例中,您将
arr
数组隐式地
private
,其中省略了修饰符本身。如果您想提供对派生类中所述
字段的访问,则需要使用
protected
的访问修饰符:

protected int[] arr;
但是不建议以这种方式公开字段,因为字段实际上应该用于私有类状态。您应该做的是通过属性封装对该字段的只读访问:

protected int[] Array { 
    get { return this.arr; }
}
这意味着在派生类中,您可以:

public double Average()
{
    return this.Array.Average();
}

改为使用protected,因此它只能由子类访问。其他类应该使用访问器访问变量。如果您只希望继承类具有访问权限,请使用protected.use protected,这样它只能由子类访问。其他类应该使用访问器访问变量。如果您只希望继承类具有访问权限,请使用受保护的。其他类已经解释了您的问题(arr是私有的),但没有人费心问:为什么您第一次尝试继承时是整数数组上的包装器?尝试对系统中尚未构建的内容进行建模;你会学到更多。祝你好运其他人已经解释了您的问题(arr是私有的),但没有人费心问:为什么您第一次尝试继承是整数数组上的包装器?尝试对系统中尚未构建的内容进行建模;你会学到更多。祝你好运@乔治·达克特谢谢你的更正!太晚了,我没法写任何东西了!;)@乔治·达克特谢谢你的更正!太晚了,我没法写任何东西了!;)像这样?:受保护的int[]arr;受保护的int[]数组{get{return this.arr;}}关键是这只是一个练习。您正在用另一种方法替换一种“不推荐”的方法(不直接公开字段)。即使您将字段“隐藏”在只读属性后面,您仍然返回数组,该数组无论如何都是可变的。事实上,我想知道这些事情在不久的将来,我只想知道这是否正确?像这样?:protected int[]arr;受保护的int[]数组{get{return this.arr;}}关键是这只是一个练习。您正在用另一种方法替换一种“不推荐”的方法(不直接公开字段)。即使您将字段“隐藏”在只读属性后面,您仍然返回数组,该数组无论如何都是可变的。事实上,我想在不久的将来知道这些事情,我只是想知道这是否可以?