C# 虚方法多态、抽象类多态
虚方法:希望重新父类中的某个方法时,使用虚方法
抽象类:有多个规定的处理方式,但实际实现的方式不同,使用抽象类
抽象类就是为了设立规范,为了互相统一和方便。
在一个类型下,某种方法,有无数种变化。
例如:不同种类的鸭子(class)有不同的叫法(方法),使用父类设计一个鸭子类,在子类中重写它的叫法。
在无数种类型下,固定几种方式,方式实现的具体都不一样。
例如:出现多种形状的物体,求矩形和面积,使用一个抽象类,固定矩形和面积两种方式,让其他类去具体写这两种方式。
虚方法多态
using System.ComponentModel;
using System.Xml.Linq;
namespace ConsoleApp1
{
internal class Class1
{
static void Main(string[] args)
{
ReaIDuck rd = new ReaIDuck();
MuDuck md = new MuDuck();
XPDuck xd = new XPDuck();
ReaIDuck[] ducks = {rd, md, xd};
for (int i = 0; i < ducks.Length; i++)
{
ducks[i].Bark();
}
}
}
public class ReaIDuck
{
public virtual void Bark()
{
Console.WriteLine("真的鸭子 嘎嘎叫");
}
}
public class MuDuck: ReaIDuck
{
public override void Bark()
{
Console.WriteLine("木头鸭子 吱吱叫");
}
}
public class XPDuck: ReaIDuck
{
public override void Bark()
{
Console.WriteLine("橡皮鸭子 叽叽叫");
}
}
}
抽象类多态
using System.ComponentModel;
using System.Xml.Linq;
namespace ConsoleApp1
{
internal class Class1
{
static void Main(string[] args)
{
Shape shape = new Circle(5);
double area = shape.GetArea();
double perimeter = shape.GetPerimeter();
Console.WriteLine("圆 面积:{0:0.00},周长:{1:0.00}", area, perimeter);
Shape shape1 = new Square(6, 7);
double area1 = shape.GetArea();
double perimeter1 = shape.GetPerimeter();
Console.WriteLine("矩形 面积:{0:0.00},周长:{1:0.00}", area1, perimeter1);
}
}
public abstract class Shape
{
public abstract double GetArea();
public abstract double GetPerimeter();
}
public class Circle : Shape
{
private double _r;
public double R
{
get { return _r; }
set { _r = value; }
}
public Circle(double r)
{
this.R = r;
}
public override double GetArea()
{
return Math.PI * this.R * this.R;
}
public override double GetPerimeter()
{
return 2 * Math.PI * R;
}
}
public class Square : Shape
{
private double _height;
public double Height
{
get { return _height; }
set { _height = value; }
}
private double _width;
public double Width
{
get { return _width; }
set { _width = value; }
}
public Square(double height, double width)
{
Height = height;
Width = width;
}
public override double GetArea()
{
return this.Height * this.Width;
}
public override double GetPerimeter()
{
return (this.Height + this.Width) * 2;
}
}
}
接口
namespace ConsoleApp1
{
internal class Class1
{
static void Main(string[] args)
{
ISwimming swim = new ReaIDuck();
swim.Swim();
ISwimming swim1 = new XPDuck();
swim1.Swim();
Console.WriteLine("");
}
}
public class ReaIDuck:ISwimming
{
public void Swim()
{
Console.WriteLine("真的鸭子会直接游泳");
}
}
public class MuDuck
{
}
public class XPDuck: ISwimming
{
public void Swim()
{
Console.WriteLine("橡皮鸭子靠橡皮游泳");
}
}
public interface ISwimming
{
void Swim();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)