1.多态
定义:不同对象对于同一个方法(Cut)调用表现出不同行为
多态性主要是靠重写和隐藏来实现
a.(父类引用指向子类对象)
b.(父类类型做参数,传递子类对象)自定义方法参数是父类类型 传递的实参是子类对象
c.(父类类型作返回类型,return子类对象)自定义方法的返回类型是父类类型,return是类对象
注:都是把子类对象赋给父类类型
举例:
添加乐器类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 继承抽象类和装箱拆箱
{
public abstract class Instrument
{
public abstract void Play();
}
public class Piano : Instrument {
public override void Play()
{
Console.WriteLine("钢琴是用来弹的!");
}
}
public class Violin : Instrument {
public override void Play()
{
Console.WriteLine("小提琴是用来拉的!");
}
}
在Main中调用
Piano pno = new Piano();
pno.Play();
Violin vln = new Violin();
vln.Play();
Console.ReadKey();
Instrument isn = new Piano();
isn.Play();
Instrument vvv = new Violin();
vvv.Play();
Console.ReadKey();
2.密封类
sealed
密封类:不允许被继承
public sealed ClassName
{
}
密封类中不能定义抽象方法、虚方法
密封方法:不能在子类中重写
密封方法必须是重写的方法
override只能重写virtual abstract override的方法
访问修饰符 sealed override 返回类型 方法名(参数列表)
{
//方法体
}
练习:
定义vehicle类,plane类,bus类
bus plane继承自vehicle
定义各自的合适的属性、方法,bus、plane必须有自己的属性、方法
定义各自的构造函数
vehicle定义虚方法run,bus重写vehicle的虚方法run,plane隐藏vehicle的虚方法run
vehicle定义虚方法refuel,bus定义密封vehicle的refuel。
练习题代码:
新建类,实现题目要求
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Day03
{
public enum VehicleType
{
公共汽车,飞机
}
public class Vehicle
{
public VehicleType type;
public string brand;
public Vehicle(VehicleType type, string brand)
{
this.type = type;
this.brand = brand;
}
public Vehicle() { }
public virtual void Run()
{
Console.WriteLine("{0}在行驶",type);
}
public virtual void Refuel()
{
Console.WriteLine("{0}在加油",type);
}
}
public class Bus : Vehicle
{
public int lineNo;
public Bus(VehicleType type, string brand, int lineNo)
: base(type, brand)
{
this.lineNo = lineNo;
}
public Bus() { }
public override void Run()
{
Console.WriteLine("{0}按照规定的路线行驶",type);
}
public sealed override void Refuel()
{
Console.WriteLine("{0}加柴油",type);
}
public void PullIn()
{
Console.WriteLine("{0}路{1}进站",lineNo,type);
}
}
public class Plane : Vehicle
{
public string flightNo;//航班号
public Plane(VehicleType type, string brand, string flightNo)
: base(type, brand)
{
this.flightNo = flightNo;
}
public Plane() { }
public new void Run()
{
Console.WriteLine("{0}号航班正在飞行",flightNo);
}
public void Start()
{
Console.WriteLine("{0}号航班正在起飞", flightNo);
}
}
}
Main方法中调用:
实例化类
调用方法并赋上参数
代码省略...
3.封装
封装:隐藏属性、方法和方法的实现细节
4.接口interface
接口是用interface关键字定义的引用数据类型
接口是一套规范,可以约束类的行为
接口定义了一系列属性、事件和方法,但是不能有具体的实现
接口中不能有字段,可以包含方法、属性、事件、索引器
接口中的所有成员默认为public abstract,默认的 不可以写
接口中没有实现,有的仅仅是对方法的声明
对于接口来说 类是对接口的实现
类实现接口时,必须实现接口中的所有方法 加public
如果一个类继承父类的同时,有实现接口,父类在前,接口在后
public class SonClass:BaseClass,IMyInterface1,IMyInterface2
{
}
练习:
定义接口Istudy,包含Study()、Exam()方法;
定义接口Iplay,包含playgame()、trip();
定义类person,给一些合理的属性(姓名、年龄、性别)、构造函数
定义类student,继承自Istudy 、person、 Iplay,实现接口中的方法,方法中输出“某某学习”等信息