class Computer {
// 公共字段
public string cpu ;
// 私有字段
private string gpu ;
// 公共属性
public string gpu_name {
get => gpu;
set => gpu = value;
}
// 公共构造函数
public Computer() {
cpu = "7500f及以上";
gpu_name = "Rx580及以上";
Console.WriteLine("{0},{1}",cpu,gpu_name);
}
// 公共自定义方法
public virtual void Configuration() {
}
}
当我执行Computer类的对象时,会输出如下:
子类继承:
也可以用base关键词进行父类构造函数调用,用的不多故不做演示
cs复制代码
class MyComputer : Computer {
public MyComputer() {
cpu = "5600";
gpu_name = "3060";
Console.WriteLine("{0},{1}", cpu, gpu_name);
}
}
子类对象:
输出:
如果父类构造函数是私有的话,就无法使用子类构造函数了
Q:我可以在调用子类构造函数的时候,不调用父类构造函数吗?
A:不行,因为这是语言设计的一部分,用于确保父类的成员被正确初始化
1.2方法继承
我将Computer类添加了一个自定义方法,并将输出语句放到方法里
cs复制代码
class Computer {
// 公共字段
public string cpu ;
// 私有字段
private string gpu ;
// 公共属性
public string gpu_name {
get => gpu;
set => gpu = value;
}
// 公共构造函数
public Computer() {
cpu = "7500f及以上";
gpu_name = "Rx580及以上";
}
// 公共自定义方法
public void Configuration() {
Console.WriteLine("{0},{1}", cpu, gpu_name);
}
}
如果子类继承以后,写一个相同名字的方法,会输出什么?
cs复制代码
MyComputer mycomputer = new MyComputer();
mycomputer.Configuration();
class Computer {
// 公共字段
public string cpu ;
// 私有字段
private string gpu ;
// 公共属性
public string gpu_name {
get => gpu;
set => gpu = value;
}
// 公共构造函数
public Computer() {
cpu = "7500f及以上";
gpu_name = "Rx580及以上";
}
// 公共自定义方法
public void Configuration() {
Console.WriteLine("{0},{1}", cpu, gpu_name);
}
}
class MyComputer : Computer {
public MyComputer() {
cpu = "5600";
gpu_name = "3060";
}
public void Configuration()
{
Console.WriteLine("{0},{1}", cpu, gpu_name);
}
}
不会继承,所以如果不做特殊处理的话,只会调用自己的方法
所以就用到了多态,直接跳到标题3:多态下
2.多态(上)
2.1方法重载
是指可以出现同名方法,规则如下:
cs复制代码
public class Example
{
public void Print(int a) { }
public void Print(int a, int b) { }
public void Print(double a) { }
public void Print(int a, double b) { }
public void Print(double a, int b) { }
}
2.2运算符重载
运算符重载,一般也用的不多先用现学即可
cs复制代码
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
cs复制代码
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
3.多态(下)
3.1虚方法(可以不重写)
在C#中,虚方法(virtual method)是指在基类中声明并可以在派生类中重写的方法
虚方法使用 virtual 关键字进行声明:
cs复制代码
public virtual void Configuration() {
Console.WriteLine("推荐配置为{0},{1}", cpu, gpu_name);
}
子类可以使用override关键字进行重写,并且添加逻辑:
cs复制代码
public override void Configuration()
{
Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);
Console.WriteLine("打印完毕");
}
调用:
cs复制代码
Computer computer = new Computer();
computer.Configuration();
MyComputer mycomputer = new MyComputer();
mycomputer.Configuration();
结果:
3.2抽象方法(强制重写)
抽象方法没有方法体,只包含在抽象类之中,只有方法签名,它们必须在派生类中实现
举个栗子:电脑这一概念的确就符合抽象的概念
cs复制代码
abstract class Computer {
// 公共字段
public string cpu ;
// 私有字段
private string gpu ;
// 公共属性
public string gpu_name {
get => gpu;
set => gpu = value;
}
// 公共构造函数
public Computer() {
cpu = "7500f及以上";
gpu_name = "Rx580及以上";
}
// 公共自定义方法
public abstract void Configuration();
}
子类继承的话,则强制进行方法重写:
cs复制代码
public override void Configuration()
{
Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);
Console.WriteLine("打印完毕");
}