[C#]抽象类

1.抽象类的定义

抽象类是包含抽象方法的类。抽象方法是没有方法内容的,只有一个方法名和参数列表,并以;结尾。为了标注他的与众不同,在他的返回类型前加abstract,并在class之前加abstract。简言之,由abstract修饰的方法和类就是抽象的方法和类。

注:抽象方法一定在抽象类中,但是抽象类中的方法不一定都是抽象方法。范例中有详解。

2.抽象类的特点

  • 抽象类只能做父类
  • 抽象类不能实例化,即不能用new来产生属于抽象类的对象
  • 抽象类中除了抽象方法与普通方法不一样外,其他部分和普通类一样,即抽象类是普通类的特例,他特殊只是有抽象方法,所以它里面可以有字段,属性,普通方法

3.抽象方法的特点

  • 抽象方法是没有方法内容的,只有一个方法名和参数列表的方法。并以;结尾
  • 在方法的返回类型前加abstract
  • 抽象方法的内容有他的继承类根据继承类自身的情况去写。重写这个方法时把abstract替换成override

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//求图形面积和周长
namespace 抽象类
{
class Program
{
static void Main(string[] args)
{
Shape sp = new Circle(8);//new retangle(4,5)
Console.WriteLine("该圆面积为{0},周长为{1}", sp.Getarea(), sp.Getperimeter());
Shape re = new retangle(4, 5);
Console.WriteLine("矩形面积为{0},周长为{1}",re.Getarea(),re.Getperimeter());
Circle cc = new Circle(4);
double s = cc.Area();//在子类中被重写的方法
double ss = re.Area(5, 6);//抽象类中的普通方法被子类继承,通过实例化子类可以调用该方法,即未被重写
Console.WriteLine("重写的方法{0},未重写的方法{1}", s, ss);
Console.ReadKey();
}
}

public abstract class Shape
{
public abstract double Getarea();
public abstract double Getperimeter();

public virtual double Area(double len, double wid)//抽象类中的普通方法
{
return len * wid;
}
}

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 * this.R;
}

public double Area()//重写该方法,类型前面可以什么都不写
{
return Math.PI * this.R * this.R;
}
}

public class retangle : Shape//矩形周长和面积
{
private double length;//私有字段
private double width;

public double Len//属性,为了保护私有字段不被外部随意改变
{
get { return length; }
set { length = value; }
}

public double Wid
{
get { return width; }
set { width = value; }
}

public retangle(double length,double width)
{
this.length = Len;
this.width = Wid;
}

public override double Getarea()
{
return this.Len * this.Wid;
}

public override double Getperimeter()
{
return 2 * this.Len * this.Wid;
}
}
}

 

posted @ 2017-11-21 11:24  LB笨小孩  阅读(304)  评论(0)    收藏  举报