C#中的继承(一)

来源:互联网 发布:没实体店怎么开淘宝店 编辑:程序博客网 时间:2024/04/29 22:06

百科里关于继承的解释:
一、常见的解释
1.接续前人未完的事业。
2.承继死者的遗产或权利。
二、编程中的术语
      “继承”是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为"A的子类",而把A称为"B的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。
这里给出类A和类B,具体说明请见注释:
类A:

    public class A
    
{
        
public virtual void Fun1()
        
{
            Console.WriteLine(
"A的第一个儿子");
        }

        
public virtual void Fun2()
        
{
            Console.WriteLine(
"A的第二个儿子");
        }

        
public virtual void Fun3()
        
{
            Console.WriteLine(
"A的第三个儿子");
        }

        
public virtual void Fun4()
        
{
            Console.WriteLine(
"A的第四个儿子");
        }

        
public void Fun5()
        
{
            Console.WriteLine(
"A的第五个儿子");
        }

        
public void Fun6()
        
{
            Console.WriteLine(
"A的第六个儿子");
        }

        
public void Fun7()
        
{
            Console.WriteLine(
"A的第七个儿子");
        }

        
public void Fun8()
        
{
            Console.WriteLine(
"A的第八个儿子");
        }

    }

类B,继承自类A:
   public class B:A
    
{
        
//通过override重写基类中的虚方法Fun1   
        public override void Fun1()
        
{
            Console.WriteLine(
"B的第一个儿子");
        }

        
//隐藏基类中的虚方法Fun2
        public void Fun2()
        
{
            Console.WriteLine(
"B的第二个儿子");
        }

        
//通过new重写基类中的虚方法Fun3,只在实例化本类B时覆盖父类方法Fun3
        new public void Fun3()
        
{
            Console.WriteLine(
"B的第三个儿子");
        }

        
//子类中没有对父类的虚方法Fun4做任何处理
        
//Fun4
        
//编译通不过,因为A.Fun5未被标记为:virtual,abstract,overrde.无法进行重写.
        
//public override void Fun5()
        
//{
        
//    Console.WriteLine("B的第五个儿子");
        
//}
        
//隐藏基类中的Fun6
        public void Fun6()
        
{
            Console.WriteLine(
"B的第六个儿子");
        }

        
//通过new重写基类中Fun7 
        new public void Fun7()
        
{
            Console.WriteLine(
"B的第七个儿子");
        }

        
//子类中没有对父类的方法Fun8做任何处理
        
//Fun8
    }

以下是对类A和类B的操作:
  public class P
    
{
        
static void Main(string[] args)
        
{
            A A1 
= new B();
            Console.WriteLine(
"A1:");
            A1.Fun1();
            A1.Fun2();
            A1.Fun3();
            A1.Fun4();
            A1.Fun5();
            A1.Fun6();
            A1.Fun7();
            A1.Fun8();
            B B1 
= new B();
            A A2 
= B1;
            
//上面的两句:B B1 = new B();和A A2 = B1;相当于 A A1 = new B();
            Console.WriteLine("B1:");
            B1.Fun1();
            B1.Fun2();
            B1.Fun3();
            B1.Fun4();
            B1.Fun5();
            B1.Fun6();
            B1.Fun7();
            B1.Fun8();
            Console.WriteLine(
"A2:");
            A2.Fun1();
            A2.Fun2();
            A2.Fun3();
            A2.Fun4();
            A2.Fun5();
            A2.Fun6();
            A2.Fun7();
            A2.Fun8();
            Console.ReadLine();
        }

    }
结果:

说明:
这里涉及到重写的方式(先不涉及抽象的概念):
virtual-override方式:
基类中被标识为virtual的方法其引用地址是程序在运行时才确定的,当父类访问子类时,如果子类中以override的方式重写了父类中的虚方法,这时虚方法的实际地址便指向被override覆盖的方法.如:A1.Fun1();
-new方式:重写基类中的方法(包括虚方法),只有当本类被实例化时才会覆盖父类的方法;
原创粉丝点击