Object是所有类的基类。
class Program
{
static void Main(string[] args)
{
Type t = typeof(Car);
Type tb = t.BaseType;
Console.WriteLine(tb.FullName);
Type tTop = tb.BaseType;
Console.WriteLine(tTop.FullName);
}
}
public class Vehicle
{
}
public class Car:Vehicle
{
}
一个派生类的实例,也是基类的实例。一个子类的实例,也是父类的实例。
class Program
{
static void Main(string[] args)
{
Car car = new Car();
Console.WriteLine(car is Vehicle); // True
}
}
public class Vehicle
{
}
public class Car:Vehicle
{
}
可以用一个父类类型的变量来引用来一个子类类型的实例。
class Program
{
static void Main(string[] args)
{
//可以用一个父类类型的变量来引用来一个子类类型的实例。
Object car = new Car();
Vehicle car2 = new Vehicle();
}
}
public class Vehicle
{
}
public class Car:Vehicle
{
}
1、封闭类:sealed修饰:最后一个类,不允许在派生出新类。
2、一个类,最多有一个基类。一个类最多只有一个父类。但是可以有多个基接口。C++可以有多个基类。
说法:
- 某个类派生自或继承自某个基类。
- 某个类实现了某个基接口;
3、子类的访问级别,不能超越父类。反过来可以,限制子类的访问级别降低。
继承的本质:
本质:派生类在基类已有的成员基础上,对基类进行的横向和纵向上的拓展。
1、派生类基于基类已有的成员。当继承发生的时候,我们的子类对父类的成员是全员获取的(全部继承)。
2、派生与继承的当中,进行的是扩展:类成员只可能是越来越多,不可能是越来越少。
3、一个类成员一旦被引入到继承链中,他就会一直向下传递。不可能再被移除掉。成员数目不能削减。这是静态语言(又叫强类型语言:编译时变量的数据类型已确定,C++\C#\Java)的特征。(动态语言:运行时才确定数据类型。Python,Javascript等)
横向:类成员在数量上的扩充,
纵向:链式继承派生。重写override。
继承就是子类在完整继承父类成员的情况下,对父类进行的横向与纵向拓展。
完全继承:
class Program
{
static void Main(string[] args)
{
RaceCar raceCar = new RaceCar();
raceCar.Owner = "F4";
}
}
public class Vehicle
{
public string Owner { get; set; }
}
public class Car:Vehicle
{
}
public class RaceCar:Car
{
}
class Program
{
static void Main(string[] args)
{
Car car = new Car();
Console.WriteLine(car.Owner);
}
}
public class Vehicle
{
public string Owner { get; set; }
public Vehicle()
{
this.Owner = "N/A";
}
}
public class Car:Vehicle
{
public Car()
{
this.Owner = "Car Owner";
}
}
this指代的是用这个类构建出来的对象它自身。
在代码创建实例执行的时候,继承链上的类。通过断点可以观察知道,先构造执行基类的构造器,然后逐级往下构造。
当我们构造子类对象的时候,父 类构造器也是会被调用的。
父类的实例构造器,是不能被子类所继承的。
class Program
{
static void Main(string[] args)
{
Car car = new Car();
Console.WriteLine(car.Owner);
}
}
public class Vehicle
{
public string Owner { get; set; }
public Vehicle(string owner)
{
this.Owner = owner;
}
}
public class Car:Vehicle
{
public Car():base("N/A")
{
this.Owner = "Car Owner";
}
}
上例中基类的构造器需要一个string类型的参数,但是子类给不了,为此,需要一个base("N/A")去传递。
封装:访问限制。
public:可以通过引用在项目以外被调用。
internal:默认:仅限于项目内部之间调用。
private:访问限制在类内。类以外不被访问。
protected:访问范围限制在继承链上。只有继承父类的子类(在继承链上)才可以访问。
在写字段的时候,很多人默认在前面加上下划线。表示是一个私有字段。类似python也是如此处置。
编程语言学习方法的问题:没有调查没有发言权,评价一门语言如何?都学会了,学精了,才有资格来点评。
面向对象的实现风格:
- Class-based:基于类的封装、继承、多态。
- Prototype-based:基于原型的封装、继承、多态。Javascript。