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

当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。

如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。

接口支持多继承;抽象类不能实现多继承。

接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。

接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。

抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。为外部提供调用或功能需要扩充时优先使用接口。

原文地址:https://www.cnblogs.com/vipcjob/p/1534559.html