一、继承
1.基本继承关系
子类继承父类后,可以调用父类的成员。
internal class Program
{
static void Main(string[] args)
{
Student student = new Student();
student.Run();
}
}
class Person
{
public void Run()
{
Console.WriteLine("Person can run.");
}
}
class Student : Person
{
}
运行结果:
2. 隐藏父类的方法
子类隐藏父类的方法,如果调用子类实例,是调用子类的方法。为了代码规范,隐藏父类的方法,子类应该加上关键字new。
internal class Program
{
static void Main(string[] args)
{
Student student = new Student();
student.Run();
// 子类隐藏了父类的方法,但是此处能调用父类对象的方法
// 父类接收子类实例,是里式替换。
Person person = new Student();
person.Run();
Console.ReadKey();
}
}
class Person
{
public void Run()
{
Console.WriteLine("Person can run.");
}
}
class Student : Person
{
// 子类隐藏父类的方法,最好加上关键字new,否则VS会提示
public new void Run()
{
Console.WriteLine("Student can run.");
}
}
运行结果:
3. 重写父类的方法
子类重写父类的方法,父类方法标注virtual,子类方法标注override。此时,即使将子类实例赋值给父类对象,调用该方法,也是调用子类重写后的方法。如果要在子列重写的实例中调用父类的virtual方法,可以使用base.方法名();
internal class Program
{
static void Main(string[] args)
{
Student student = new Student();
student.Run();
Person person = new Student();
person.Run();
Console.ReadKey();
}
}
class Person
{
// 如果要重写父类方法,父类方法必须标注virtual
public virtual void Run()
{
Console.WriteLine("Person can run.");
}
}
class Student : Person
{
// 子类重写父类中的虚方法
public override void Run()
{
Console.WriteLine("Student can run.");
}
}
运行结果:
4. 抽象方法
在父类中定义抽象方法,是为了让不同子类进行不同的实现,从而满足子类与子类间的不同具体行为。
static void Main(string[] args)
{
Student student = new Student();
student.Run();
Person person = new Student();
person.Run();
Console.ReadKey();
}
}
// 抽象类可以包含抽象方法,也可以包含具体方法
abstract class Person
{
// 抽象方法必须写在抽象类中,没有具体实现,在子类中必须实现
public abstract void Run();
}
class Student : Person
{
// 子类实现父类中的抽象方法
public override void Run()
{
Console.WriteLine("Student can run.");
}
}
运行结果:
5. 多态
使用接口interface实现多态,主要目的:实现解耦,从而实现不同的具体行为。
internal class Program
{
static void Main(string[] args)
{
List<IUSB> lst = new List<IUSB>();
lst.Add(new Fan());
lst.Add(new Light());
lst.Add(new UDisk());
foreach(var item in lst)
{
item.Work();
}
Console.ReadKey();
}
}
interface IUSB
{
// C# 8.0后接口方法才能用访问修饰符;
// 接口中只能定义方法和属性;
void Work();
}
class Fan : IUSB
{
public void Work()
{
Console.WriteLine("Fan is working.");
}
}
class Light : IUSB
{
public void Work()
{
Console.WriteLine("Light is working.");
}
}
class UDisk : IUSB
{
public void Work()
{
Console.WriteLine("UDisk is working.");
}
}
运行结果:
6. 重载
// 重载,方法名相同,参数类型或数量不同,与返回值无关
class Person
{
public void Run()
{
Console.WriteLine("Person can Run.");
}
public void Run(string name)
{
Console.WriteLine(name + "can Run.");
}
}