多态
概念:让一个对象能够表现出多种状态
实现多态:1.虚方法(父类方法virtual、子类方法overwrite,可以实例化);
2.抽象类;(抽象出一个父类,共有方法,方法不能实现)
3.接口;(找不出父类,有相同行为)
动态多态常指抽象类的继承;
静态多态可用泛化编程实现,使用模板可行;
函数多态即重载;
宏多态原因在于它只是进行对应字节调换,不会辨别变量类型。
#region 三个虚方法实现多态的测试类
class Animal
{
public virtual void action()
{
Console.WriteLine("animal run");
}
}
class Cat:Animal
{
public override void action()
{
Console.WriteLine("Cat eat");
}
}
class Dog:Animal
{
public override void action()
{
Console.WriteLine("Dog fly");
}
}
#endregion
#region 多态例子
Animal animal = new Animal();
Cat cat = new Cat();
Dog dog = new Dog();
Animal[] nums = { animal, dog, cat };
List<object> list = new List<object>();
list.Add(cat);
list.Add(animal);
list.Add(dog);
for (int i = 0; i < nums.Length; i++)
{
nums[i].action();
}
//集合乱入
for (int i = 0; i < list .Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();
#endregion
抽象:abstract
不允许有方法体
不知道如何去实现
- 如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
- 如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类
#region 三个抽象多态测试类:计算面积和周长
//形状类
abstract class Shape
{
public abstract double getS();
public abstract double getZ();
}
//圆类
class Circle : Shape
{
public Circle(double r)
{
this.R = r;
}
public Circle()
{
}
private double r;
public double R
{
get { return r; }
set { r = value; }
}
public override double getS()
{
return Math.PI*R*R;
}
public override double getZ()
{
return 2*Math.PI*R;
}
}
//矩形类
class Square : Shape
{
private double l;
private double h;
public Square(double h,double l)
{
this.H = h;
this.L = l;
}
public Square() { }
public double L
{
get { return l; }
set { l = value; }
}
public double H
{
get { return h; }
set { h = value; }
}
public override double getS()
{
return L * H;
}
public override double getZ()
{
return (L + H) * 2;
}
}
#endregion
Shape shape = new Circle(5);//new Square(5,9);
double res1 = shape.getS();
double res2 = shape.getZ();
Console.WriteLine(res1);
Console.WriteLine(res2);
其余随记:
在一个项目中引用另外一个项目的类:
- 添加引用
- 引用命名空间
protected 是受保护的,只有当前类的成员与继承该类的类才能访问;private是完全私有的,有当前类中的成员能访问到。
<字符串>
* 1.Split() 分割不想要的,返回字符数组
* 2.Substring() 切割字符串
* 3.ToUpper() 转大写
* 4.ToLower() 转小写
* 5.Trim() 去两边空格
* 6.TrimEnd() 去后面空格
* 7.TrimStart() 去前面空格
* 8.Constains() 判断是否包含
* 9.Replace() 替换
* 10.IndexOf() 查找第一次出现位置
* 11.LastIndexOf() 最后一次出现位置
* 12.StartWith() 以什么开始
* 13.EndWith 以什么结束
* 14.string.join() 把数组按照指定连接符连接
* 15.string.IsNullOrEmpty() 是否为空
* 16.ToCharArray() 变成char类型数组
* 17.new string(char[] chs) 返回一个字符串
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回null
//is 的用法
if(person is student){
Student ss=(Student)person;
ss.StudentSayHello();
}else{
console.WriteLine("转换失败");
}
//as 的用法
Student t = p as Student;
t.StudentSayHello();