抽象类与抽象方法:
先说些概念的东西:
在一个类前面加上“abstract”关键字,此类就成为了抽象类。 对应的,一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法。
abstract class Fruit //抽象类
{
public abstract void GrowWhere(); //抽象方法
}
注意抽象方法不能有实现代码,在函数名后直接跟一个分号。
抽象类专用于派生出子类,子类必须实现抽象类所声明的抽象方法,否则,子类仍是抽
象类。
好了,说一下我个人的理解吧:抽象类就是定义一个类(里面不止是有方法还有属性,属性等等讲),里面都是些想要被重写的方法(属性),然后方便子类重写,抽象类的抽象方法就不能写实行代码,子类去写。也可以理解,抽象类里的抽象方法(属性)都很抽象,每个子类的实现代码都不一样,这样就方便子类去写,也就不必虚拟和重写了。
还有就是抽象类里的所有抽象方法,子类都要用到。
看个列子吧:
namespace StudyTemp
{
abstract class Fruit
{
public void SayHello()
{
Console.WriteLine("大家好,我是水果!");
}
public abstract void GrowWhere();
}
class Apple : Fruit
{
public override void GrowWhere()
{
Console.WriteLine("南方北方都有我");
}
}
class Banana : fruit
{
public override void GrowWhere()
{
Console.WriteLine("南方才有我");
}
}
class Program
{
static void Main(string[] args)
{
Fruit f;
f = new Apple();
f.SayHello();
f.GrowWhere();
f = new Banana();
f.SayHello();
f.GrowWhere();
Console.ReadKey();
}
}
}
截图:

这个列子还想说一些细节方面的:
包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。也就是当一个类里有一个方法是抽象方法,那么这个类就是抽象类,但是抽象类里可以有不抽象的方法和属性。就不如上面的SayHello方法。
在调用的时候就应该这样:抽象类 抽象类变量名 = new 继承自此抽象类的具体子类名( );
抽象属性
刚才说了,除了方法可以是抽象的之外,属性也可以是抽象的。
先给个例子吧,也是水果的:
namespace StudyTemp
{
abstract class Fruit
{
public abstract string Name
{
get;
set;
}
public abstract void SayHello();
}
class Apple : Fruit
{
private string name;
public override string Name
{
get
{
return name;
}
set
{
if (value != "小红")
{
this.name = value;
}
else
{
Console.WriteLine("不能用这个名字!");
return;
}
}
}
public override void SayHello()
{
Console.WriteLine("我是苹果{0}",name);
}
}
class Program
{
static void Main(string[] args)
{
Fruit f;
f = new Apple();
f.Name = "小白";
f.SayHello();
Fruit a;
a = new Apple();
a.Name = "小红";
Console.ReadKey();
}
}
}

看到了,我们对属性也进行了重写。