类声明
类声明的位置
1.命名空间内 2.创建另一个自己的命名空间 3.在命名空间外声明类,实际声明在全局命名空间 4. 在类内声明类,成为一个类的成员类
声明即定义(c#,java)
c,c++声明与定义分开,也可以合并在一起。
最简单的类声明
class-modifyers(opt类修饰符) class identify {class body}
类修饰符
new 适用于嵌套类
internal(在类库内可访问),protected,internal,private 修饰符将控制类的可访问性
abstract
sealed
static
类的访问控制
类成员的访问控制
一个类库
using System;
namespace Mylib
{
public class Vehicle
{
public int MyProperty { get; set; }
}
}
主函数
using Mylib;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Vehicle vehicle = new Vehicle();
vehicle.MyProperty = 100;
System.Console.WriteLine(vehicle.MyProperty);
}
}
}
如果将类库里的成员函数的访问级别设为internal(默认为internal),那么尽管这个类是public,他的成员却无法访问
类库里的成员若为private,则类外继承的子类无法访问父类的成员(protected和public可以)
protected将访问级别控制在继承链上。
访问级别还可以进行组合……
类的继承
基类-派生类 (父类-子类)
如果类没有继承,那么默认继承与system.object类。system.object无基类。
子类的实例也是父类的实例。可以用父类型的变量去引用子类的实例。子类的访问级别不能超越基类的访问级别。只能有一个基类,但是可以实现多个基接口。
继承的本质:派生类在基类已有的成员基础之上,对基类进行的横向和纵向上的扩展:
1.子类完整接受父类成员
静态类型语言(c++,c#,java)中,类成员一旦被引入继承链当中,他就会永远的向下传递,不能移除 .动态类型(python,javascript)可移除。
横向-类成员在数量上的扩充,纵向-类的更新迭代。
从基类构造器开始,先构造基类对象,然后一级一级往下构造,如果基类构造器带参数,那么子类也应该带参数。
特别注意的是,构造器是不被继承的,完全继承的是方法,属性,事件等。当出现基类构造器带参数时,采用以下两种方法
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Car car = new Car();
car.show();
Console.WriteLine(car.MyProperty);
}
}
class Vehicle
{
public Vehicle( int content)
{
this.MyProperty = content;
}
public int MyProperty { get; set; }
}
class Car : Vehicle
{
public Car() : base(125)//1.
{
this.MyProperty = 2;
}
public Car(int content):base(content)//2.
{}
public void show()
{
Console.WriteLine(base.MyProperty);
}
}
}
面向对象的分格
class-based 基于类的继承封装多态
prototype-based 基于原型的继承封装多态(javascript)