方法默认访问级别: private;类默认访问级别 : internal。
1. 命名空间下的元素的默认访问修饰符
① public: 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。
② internal: 同一程序集中的任何代码都可以访问该类型或成员,但其他程序集不可以访问。
2. 各类型中的成员的默认访问修饰符
剩下的修饰符主要是正对继承这个语言特性的,拥有继承的类型有两个类(class)和接口(interface)。public,internal同样可以用于类型成员。
① private: 同一类和结构的代码可以访问该类型和成员。
② protected: 同一类和派生(继承特性)类中的代码可以访问该类型和成员。
③ protected internal: 同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。
但要注意:
① 派生类的可访问性不能高于其基类型。换句话说,不能有从内部类 A 派生的公共类 B。如果允许这种情况,将会使 A 成为公共类,因为 A 的所有受保护的成员或内部成员都可以从派生类访问。
② 成员的可访问性决不能高于其包含类型的可访问性。
③ 可以使用五种访问类型中的任何一种来声明类成员(包括嵌套的类和结构)。
3. 其他数据类型的修饰符
接口(interface):接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
类(class):构造函数默认为public访问修饰符;析构函数不能显示使用访问修饰符且默认为private访问修饰符;类的成员默认访问修饰符为private。
枚举(enum):枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
结构(struct):结构成员默认为private修饰符;结构成员无法声明为protected成员,因为结构不支持继承。
嵌套类型:嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。
4. 几个问题
(1)私有成员可以继承吗?
① 从内存空间上,子类继承了父类,那些私有成员是会被分配内存空间的,也就是说被继承;
② 从多态角度上,继承的作用主要是实现多态,私有成员虽然被继承,但却不能在子类中访问,这样就没有达到多态的目的,因此,可以说没有被继承。
③ 因此,在实际工作中,不可能把要继承的成员设为私有的,所以不必过于纠结,理解即可。
(2)怎么理解继承?
继承就是子类在父类基础之上的纵向和横向扩展,纵向扩展即重写;横向扩展即增加子类的特有成员。另外,父类的构造函数和析构函数子类无法继承,但可以调用。
namespace ClassLearning
{
class Program
{
static void Main(string[] args)
{
Car car = new Car();
Console.WriteLine(car.NumWheels);
}
}
class Vehicle
{
private int _numWheels;
public int NumWheels { get => _numWheels; set => _numWheels = value; }
// 父类构造方法(有参)
public Vehicle(int numwheels)
{
this.NumWheels = numwheels;
}
}
class Car:Vehicle
{
public string Color { get; set; }
// 子类构造方法,必须提供父类的参数
public Car(string color) :base(8)
{
this.Color = color;
}
}
上述代码中,实例化 car 对象时,先调用父类 Vehicle 的构造器,然后才调用子类的构造器。
注意:实例化子类对象时,子类会自动调用父类的无参构造器,当父类没有无参构造器,则在子类构造器中必须提供与父类有参构造器相应的实参。