C#基础系列第五篇
前言: 完全是我在学习过程中记录的笔记,只不过分享一下让很多刚开始学习.net编程的人能够很快的学会C#语言
- 多态的一些说明
(1) 多态就是为了程序的可扩展性
(2)多态的使用:将不同的对象当作父类来看,屏蔽掉各个对象间的不同,写出通用代码,做出通用编程,同样调用不同结果,以适应需求的不断变化
(3)ToString方法有Object提供,使得所有的类型均可以使用Console.WriteLine()方法
class Person
{
public string Name { get; set; }
public int Age { get; set; }
//当写第三个的时候写入下面的方法
public override string ToString()
{
return Name;
}
}
class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 34, 4, 65, 7, 87, 454 };
Console.WriteLine(nums);
//输出:System.Int32[]
//准备对象
Person p = new Person();
p.Name = "韩迎龙";
p.Age = 19;
Console.WriteLine(p);
//输出:智能机器.Person
//第三个
Person p1 = new Person();
p1.Name = "韩迎龙";
p1.Age = 19;
Console.WriteLine(p);
//输出张三
Console.ReadKey();
}
}
(4)多态的保障
1)继承,相同名字的方法(重载不算)
2)里氏转换原则
(5)is和as
1)判断父类继承
2)判断接口实现
3)判断拆箱和装箱
2.多态实现计算器
(1) 新建一个控制台应用程序,起名为多态计算器
(2)添加一个CalculstingWay类,表示计算的方法
/// <summary>
/// 计算机的计算
/// </summary>
class CalculstingWay
{
int num1;
int num2;
public int Num1
{
get { return num1; }
set { num1 = value; }
}
public int Num2
{
get { return num2; }
set { num2 = value; }
}
public CalculstingWay(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
public virtual int Calculating()
{
//这个方法是需要子类重写的
return 0;
}
}
(3)添加一个Add类,表示实现加法的计算
/// <summary>
/// 提供加法计算的方法
/// </summary>
class Add:CalculstingWay
{
public Add(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(4)添加一个Sub类,表示实现减法的计算
/// <summary>
/// 提供减法计算的方法
/// </summary>
class Sub : CalculstingWay
{
public Sub(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 - base.Num2;
}
}
(5)添加一个Multi类,表示实现乘法的计算
/// <summary>
/// 提供乘法计算的方法
/// </summary>
class Multi : CalculstingWay
{
public Multi(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(6)添加一个Div类,表示实现除法的计算
/// <summary>
/// 提供除法计算的方法
/// </summary>
class Div : CalculstingWay
{
public Div(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(7)添加一个Calculator类,表示计算器类
/// <summary>
/// 表示计算器
/// </summary>
class Calculator
{
//可以进行计算的对象
CalculstingWay cal;
public Calculator(int num1, int num2, string oper)
{
switch (oper)
{
case "+":
cal = new Add(num1, num2);
break;
case "-":
cal = new Sub(num1, num2);
break;
case "*":
cal = new Multi(num1, num2);
break;
case "/":
cal = new Div(num1, num2);
break;
default:
cal = null;
break;
}
}
public int jisuan()
{
if (cal != null)
{
return cal.Calculating();
}
else
{
return -1;
}
}
}
3. 抽象方法
(1) 父类提供一个可以被重写的方法,有子类重写,通过父类,new子类来调用
(2)父类不需要方法体
(3)语法:[public] abstract 返回类型 方法名(参数);
和方法相比有以下几点需要注意的:
1)去掉方法体,直接在圆括号结束的时候加分号
2)加上abstract进行修饰
(4)抽象方法只允许在抽象类中存在
1)只要在class关键字前面用abstract修饰即可
abstract class 类名
{
//成员
}
(5)抽象方法,抽象类就是为了被子类继承,重写的
abstract class Animal
{
public abstract void Shout();
}
class Dog : Animal
{
public override void Shout()
{
Console.WriteLine("财旺福王运道旺");
}
}
class Cat : Animal
{
public override void Shout()
{
Console.WriteLine("喵喵喵");
}
}
class Program
{
static void Main(string[] args)
{
Animal[] animals = {
new Dog(),
new Cat()
};
for (int i = 0; i < animals.Length; i++)
{
animals[i].Shout();
}
Console.ReadKey();
}
}
(6)抽象方法的细节
1)抽象类中可以包含什么东西?
->比一般类多了抽象成员
->抽象成员有有什么:方法,属性,索引器,事件声明
2)抽象类不允许实例化,不能new
3)抽象类可以有构造方法
4)抽象类可以来源于非抽象类
class MyBase
{
}
abstract class Test : MyBase
{
public abstract void Func();
}
class MySub : Test
{
public override void Func()
{
Console.WriteLine("抽象类可以来源于非抽象类");
}
}
5)抽象类必须被子类重写,除非子类也是抽象的
(7)练习:有一个形状Shape类,派生出圆Circle,矩形Rectangle和正方形Square,分别计算他们的面积Area和周长Perimeter
1)新建一个控制台项目:起名为多态小案例
2)添加一个Shape类,实现计算面积和周长的方法
abstract class Shape
{
public abstract double GetArea();
public abstract double GetPerimeter();
}
3)添加一个Circle类,实现计算圆的面积和周长
class Circle : Shape
{
int r;
public Circle(int r)
{
this.r = r;
}
public override double GetArea()
{
return Math.PI * Math.Pow(r, 2);
}
public override double GetPerimeter()
{
return 2 * Math.PI * r;
}
}
4)添加一个类,实现计算矩形的面积和周长
class Rectangle : Shape
{
double widthX;
double heightY;
public Rectangle(double widthX, double heightY)
{
this.widthX = widthX;
this.heightY = heightY;
}
public override double GetArea()
{
return widthX * heightY;
}
public override double GetPerimeter()
{
return 2 * (widthX + heightY);
}
}
5)添加一个类,实现计算正方形的面积和周长
class Square : Shape
{
double length;
public Square(double length)
{
this.length = length;
}
public override double GetArea()
{
return Math.Pow(length, 2);
}
public override double GetPerimeter()
{
return 4 * length;
}
}
class Square1 : Rectangle
{
public Square1(double length)
: base(length, length)
{
}
}
6)在Main方法中实现的代码如下:
class Program
{
static void Main(string[] args)
{
Circle circle = new Circle(5);
Console.WriteLine(circle.GetArea().ToString("0.00"));
Console.WriteLine(circle.GetPerimeter().ToString("0.00"));
Rectangle rec = new Rectangle(5, 10);
Console.WriteLine(rec.GetArea());
Console.WriteLine(rec.GetPerimeter());
Square square = new Square(5);
Console.WriteLine(square.GetArea());
Console.WriteLine(square.GetPerimeter());
Square1 sqr = new Square1(5);
Console.WriteLine(sqr.GetArea());
Console.WriteLine(sqr.GetPerimeter());
}
}
(8)抽象属性
1)使用abstract修饰
2)去掉方法体
3)语法:public abstract 返回类型 属性
{
get;
set;
}
4)自动属性必须包含get,set方法
5)抽象属性可以定义只读,只写,
(9)由子类实现抽象属性的方法
1)用override重写属性
2)添加一个字段,使用属性
- 面向对象计算器(简单工厂计算器)
(1) 新建一个控制台应用程序,起名为:简单工厂计算器(最好写成英文的,我是为了学习直接写成中文的了)
(2)新建一个CalculatingWay类,实现计算机的父类计算
/// <summary>
/// 计算机的计算
/// </summary>
abstract class CalculstingWay
{
int num1;
int num2;
public int Num1
{
get { return num1; }
set { num1 = value; }
}
public int Num2
{
get { return num2; }
set { num2 = value; }
}
public CalculstingWay(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
public abstract int Calculating();
}
(3)新建一个Add类,
/// <summary>
/// 提供加法计算的方法
/// </summary>
class Add:CalculstingWay
{
public Add(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(4)新建一个Sub类,
/// <summary>
/// 提供减法计算的方法
/// </summary>
class Sub : CalculstingWay
{
public Sub(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 - base.Num2;
}
}
(5)新建一个Multi类,
/// <summary>
/// 提供乘法计算的方法
/// </summary>
class Multi : CalculstingWay
{
public Multi(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(6)新建一个Div类,
/// <summary>
/// 提供除法计算的方法
/// </summary>
class Div : CalculstingWay
{
public Div(int n1, int n2)
: base(n1, n2)
{
}
public override int Calculating()
{
return base.Num1 + base.Num2;
}
}
(7)新建一个Factory类
static class Factory
{
public static CalculstingWay GetCalculator(int n1,int n2,string oper)
{
switch (oper)
{
case "+":
return new Add(n1, n2);
case "-":
return new Sub(n1, n2);
case "*":
return new Multi(n1, n2);
case "/":
return new Div(n1, n2);
default:
return null;
}
}
}
(8)在Main方法中写入如下这段代码:
class Program
{
static void Main(string[] args)
{
//提示用户输入
Console.Write("请用户输入第一个数字:");
int num1 = GetInputNum();
Console.Write("请用户输入第一个数字:");
int num2 = GetInputNum();
Console.Write("请输入运算符");
string oper = Console.ReadLine();
//开始生产
CalculstingWay cal = Factory.GetCalculator(num1, num2, oper);
//开始投入使用
if (cal != null)
{
int res = cal.Calculating();
Console.WriteLine("{0}{1}{2}={3}", num1, oper, num2, res);
}
else
{
Console.WriteLine("运算符有误");
}
}
public static int GetInputNum()
{
return GetInputNum(int.MinValue, int.MaxValue);
}
/// <summary>
/// 完成int类型数据的输入,并返回,要求输入的数字在0到给定的数字之间
/// </summary>
/// <param name="max">给定的数字的上限</param>
/// <returns></returns>
public static int GetInputNum(int max)
{
return GetInputNum(0, max);
}
/// <summary>
/// 完成int数字的输入,要求在给定范围之间
/// </summary>
/// <param name="min">给定范围的下线</param>
/// <param name="max">给定范围的上线</param>
/// <returns></returns>
public static int GetInputNum(int min, int max)
{
string str = Console.ReadLine();
int num;
while (true)
{
try
{
num = Convert.ToInt32(str);
if (num > min && num < max)
{
break;
}
Console.Write("输入数字不再{0}到{1}之间,请重新输入", min, max);
str = Console.ReadLine();
}
catch
{
Console.Write("输入有误,请重新输入");
str = Console.ReadLine();
}
}
return num;
}
}
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

浙公网安备 33010602011771号