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;}}关键是这只是一个练习。您正在用另一种方法替换一种“不推荐”的方法(不直接公开字段)。即使您将字段“隐藏”在只读属性后面,您仍然返回数组,该数组无论如何都是可变的。事实上,我想在不久的将来知道这些事情,我只是想知道这是否可以?