首页 > 代码库 > 面向对象:继承、抽象类、抽象方法、虚方法

面向对象:继承、抽象类、抽象方法、虚方法

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
}


}
}

面向对象:继承、抽象类、抽象方法、虚方法