1、继承
什么是继承?
目的:代码重用
public class 子类:父类
{
}
父类 基类 被继承的类
子类 派生类 需要继承的类
父类构造函数的继承
创建子类对象时,先调用父类构造函数,再调用子类构造函数
默认调用父类无参构造函数
如果子类有无参构造函数,要求父类也有无参构造函数
如果调用父类的有参构造函数,显式用base调用
public 子类(参数列表)base(实参)
实参:要调用的父类的有参构造函数的参数列表{}
base:父类对象(父类实例)
2.抽象
abstract
抽象方法:访问修饰符 abstract 返回类型 方法名(参数);
抽象方法只是行为的声明,没有方法体,没有具体实现
抽象方法必须在抽象类中定义
抽象方法必须在非抽象子类中实现
抽象类:访问修饰符 abstract class 类名{}
抽象类可以包含抽象方法,和非抽象方法(实现方法,虚方法)
抽象类不能实例化
抽象类中的抽象方法必须在非抽象子类中实现
抽象类通常会被继承(通常在抽象类中写抽象方法只是为了声明一下子类中要实现的方法,方法体写在子类中的重写的方法中)
重写方法:访问修饰符 override 返回类型 方法名(参数){方法体}
子类对父类方法的改写
当重写父类中的方法时要保证方法的签名必须保持一致
3.虚方法:
virtual
继承 重写 定义的位置
实现方法 可以继承 不能重写 任何地方
抽象方法 可以继承 必须重写 抽象类中
虚方法 可以继承 可以重写 除静态类、密封类之外
3.装箱与拆箱
装箱:值类型转换成Object类型或者此值类型所实现的任何接口类型的隐式转换(一定能成功)
操作:在堆中分配一个对象实例,将该值复制到新的对象中(会多占用内存,影响性能)
例子:int i=10;
隐式装箱(可以是隐式的也可以是显式的)
object obj=i;
显示装箱
obj=(obj)i
拆箱:从Object类型到值类型或者此值类型实现的接口类型的隐式转换(不一定成功)
例子:隐式拆箱
int n=(int)obj
装箱拆箱规则:任何值类型都能装箱/拆箱不一定成功
装箱拆箱缺点:影响程序性能
练习:定义形状类,包含计算面积的方法,分别定义一个圆类和矩形类,添加需要的属性和构造函数
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承抽象类和装箱拆箱
{
public abstract class Shapcs//父类
{
public abstract double Sum();
}
public class Yuan : Shapcs
{
public double r;
public Yuan(double r)
{
this.r = r;
}
public Yuan() { }
public override double Sum()
{
return Math.PI * r * r;
}
}
public class Ju : Shapcs
{
public double sid;
public double hid;
public Ju(double sid,double hid)
{
this.sid = sid;
this.hid = hid;
}
public Ju() { }
public override double Sum() {
return sid * hid;
}
}
}
Main方法中调用的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承抽象类和装箱拆箱
{
class Program
{
static void Main(string[] args)
{
#region 重写 抽象方法 计算圆和矩形的面积
Yuan y = new Yuan(2.6);
Console.WriteLine(y.Sum());
Ju j = new Ju(5, 6);
Console.WriteLine(j.Sum());
Console.ReadKey();
//Cat ca = new Cat();
//ca.Eat();
//ca.Sleep();
//Console.ReadKey();
//#endregion
}
}
}