继承,接口,构造函数一篇就懂
继承
继承:继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。
当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。
继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物
copy:菜鸟编程 C#继承
接口
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
接口使得实现接口的类或结构在形式上保持一致。
抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。
接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。
抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类
C#接口
构造函数
每当创建类或结构时,将会调用其构造函数。 类或结构可能具有采用不同参数的多个构造函数。 使用构造函数,程序员能够设置默认值、限制实例化,并编写灵活易读的代码。 有关详细信息和示例,请参阅使用构造函数和实例构造函数。(copy 微软官方文档)
构造函数的定义
实例代码
关于三个知识的理论点可通过下面链接去看看,个人觉得还是写的比较易懂
我这里直接写一个关于三个知识点的练习。
实例:
长方形(基类),拥有长和宽(属性),面积(构造函数)
桌子(派生类)也属于(继承)长方形,桌子拥有费用(属性)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace C_ClassDemo
{
class Program
{
static void Main(string[] args)
{
//实例化一张桌子,这个桌子长4.5,宽7.5
Table t = new Table(4.5,7.5);
t.Display();
Console.Read();
}
}
//长方形基类
class Rectangle
{
//长方形拥有,长宽两个属性。定义长宽
protected double length;
protected double width;
//初始化长方形的属性
public Rectangle(double l, double w)
{
this.length = l;
this.width = w;
}
//计算面积
public double GetArea()
{
return length * width;
}
//显示需要输出的信息
public void Display()
{
Console.WriteLine("长度:{0}",length);
Console.WriteLine("宽度:{0}", width);
Console.WriteLine("面积:{0}",GetArea());
}
}
//桌子是派生类,继承自长方形类,长方形是父类
class Table : Rectangle
{
//定义费用
private double cost;
//继承父类的构造方法,就拥有了长,宽属性
public Table(double l, double w) : base(l, w)
{
}
//计算花费
public double GetCost()
{
double cost;
cost = GetArea() * 70;
return cost;
}
//显示桌子需要输出的信息
public void Display()
{
//先调用父类的输出信息,显示长,宽,面积,
base.Display();
//输出桌子的花费属性。
Console.WriteLine("成本:{0}",GetCost());
}
}
}
输出结果:
我们现在想知道一张桌子的长宽面积以及费用,
就需要先new 一张桌子出来(实例化对象),桌子在出厂的时候,就拥有了长和宽(对象的初始化)。有了构造函数,就不必new一张桌子 之后进行
table.length=4.5
table.width=7.5 这项工作。
直接调用桌子.display()显示包,即可一键显示信息。
但是 桌子的功能有些什么呢??
按照刚刚的思路来,在写一个功能类,然后桌子继承功能!
但是
所以我们用一个功能接口来实现 功能的输出
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace C_ClassDemo
{
class Program
{
static void Main(string[] args)
{
//实例化一张桌子,这个桌子长4.5,宽7.5
Table t = new Table(4.5, 7.5);
//显示桌子的基本信息和作用
t.Display();
t.Eat();
Console.Read();
}
}
//长方形基类
class Rectangle
{
//长方形拥有,长宽两个属性。定义长宽
protected double length;
protected double width;
//初始化长方形的属性
public Rectangle(double l, double w)
{
this.length = l;
this.width = w;
}
//计算面积
public double GetArea()
{
return length * width;
}
//显示需要输出的信息
public void Display()
{
Console.WriteLine("长度:{0}", length);
Console.WriteLine("宽度:{0}", width);
Console.WriteLine("面积:{0}", GetArea());
}
}
//桌子是派生类,继承自长方形类,长方形是父类,继承功能接口
class Table : Rectangle,Ieffect
{
//定义费用
private double cost;
//继承父类的构造方法,就拥有了长,宽属性
public Table(double l, double w) : base(l, w)
{
}
//计算花费
public double GetCost()
{
double cost;
cost = GetArea() * 70;
return cost;
}
public void Eat()
{
Console.WriteLine("桌子可以用来吃饭");
}
//显示桌子需要输出的信息
public void Display()
{
//先调用父类的输出信息,显示长,宽,面积,
base.Display();
//输出桌子的花费属性。
Console.WriteLine("花费:{0}", GetCost());
}
}
//功能接口
interface Ieffect
{
//吃饭
void Eat();
}
}
输出结果:
三个点,在平时练习中似乎作用不大,但到了正式项目中,可以减少很多代码的重复量!
本人菜鸟,写的不好,请见谅,如有错误,请指出
上一篇: 微信接口配置token验证失败。
推荐阅读