C#继承
#region Example 1
public class A
{
public int num = 1;
public void Fun() { }
protected int num2 = 2;
protected void Fun2() { }
int num3 = 3; //私有
void Fun3() { }
}
public class B : A
{
//这里无法使用num、num2、Fun()和Fun2()
private void FunB() //子类函数里调用父类属性和方法
{
num++;
num2++;
Fun();
Fun2();
}
}
private void OutSizeFun() //类外不能使用protected属性和方法
{
B b = new B();
b.num = 3;
b.Fun();
//这里无法使用b.num2和b.Fun2()
}
#endregion
#region Example 2
public class A
{
public int a_num = 1;
public void a_Fun() { }
public virtual void Fun() //虚函数
{
Console.Write("A_Fun");
}
}
public class B : A
{
public int b_num = 1;
public void b_Fun() { }
public override void Fun()
{
Console.Write("B_Fun");
}
}
static void Main(string[] args)
{
A a = new A();
a.a_Fun();
a.a_num++;
a.Fun(); //A_Fun
A a2 = new B();
a2.a_Fun();
a2.a_num++;
a2.Fun(); //B_Fun,A类函数被重载
B b = new B();
b.a_Fun();
b.a_num++;
b.b_Fun();
b.b_num++;
b.Fun(); //B_Fun
}
#endregion
#region Example 3
//Error 1
public class A
{
public abstract void Fun() { } //错误。抽象方法必须存在于抽象类中
}
//Error 2
public abstract class A
{
public abstract void Fun() { } //错误。抽象方法无法声明主体(不能有函数体)
}
//Error 3
public abstract class A
{
public abstract void Fun();
}
public class B : A //错误。没有实现基类的抽象方法
{
}
//Error 4
public class A
{
public virtual void Fun(); //错误。虚函数必须声明主体(必须有函数体)
}
//Correct 1
public class A
{
public virtual void Fun() { }
}
public class B : A //虚函数不一定要实现重载
{
}
#endregion
#region 多态
参考文章:http://www.cnblogs.com/patrickchen/archive/2008/10/30/1323115.html
//SuperClass refSuper = new SubObjClass(); //父类引用指向子类对象
//这样的写法主要是为了实现多态,即父类应该存在一个虚方法,可以让子类重载(override)。
//在定义父类时未能及时细化子类,也可以使子类在未完成之前先使用父类的virtual(虚)方法,完成之后不需要再修改程序
public class AnimalVoice
{
public AnimalVoice()
{ }
public virtual void MakeVoice()
{
Console.WriteLine("Make a Animal Voice");
}
}
public class DogVoice : AnimalVoice
{
public DogVoice()
{ }
public override void MakeVoice()
{
Console.WriteLine("Make a Dog Voice");
}
}
public class CatVoice : AnimalVoice
{
public CatVoice()
{ }
//"Makevoice" hasn't been finished, or doesn't want to be used
}
static void Main(string[] args)
{
AnimalVoice animalVoice = new AnimalVoice();
animalVoice.MakeVoice(); //Make a Animal Voice
AnimalVoice dogVoice = new DogVoice();
dogVoice.MakeVoice(); //Make a Dog Voice
AnimalVoice catVoice = new CatVoice();
catVoice.MakeVoice(); //Make a Animal Voice
Console.Read();
}
#endregion
对抽象编程:接口和抽象类:
参考文章:http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html
当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。
如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。
接口支持多继承;抽象类不能实现多继承。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。为外部提供调用或功能需要扩充时优先使用接口。