zoukankan      html  css  js  c++  java
  • C#中父类与子类的继承关系

      C#中的父类与子类的继承关系与C和C++中的类似,这里先阐述最重要的一点:假如子类继承了父类,那么子类可以强制转换为父类,并且保证编译和运行都不出错;但是父类强制转换成子类的时候,编译可以通过运行通不过。请看如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace FatherAndSon
    {
        class ClassA
        {
            static void Main(string[] args)
            {
                //编译和运行都能通过
                ClassB b = new ClassB();
                ClassA a = (ClassA)b;
               
                //编译能通过,运行通不过
                ClassA aa = new ClassA();
                ClassB bb = (ClassB)aa;
            }
    
        }
    
        class ClassB : ClassA
        {
           
        }
    }
    
    

      实际上:将子类强制转换为父类之后,在用这个父类强制转换为另外一个子类的时候编译和运行也都能通过;只是如果将父类直接转换为子类的时候运行会出错。这就好比:假设父类是一个装了5个“苹果”的“小型篮子”,而子类则是一个装了5个“苹果”和5个”西瓜“的大型篮子;将子类强制转换为父类<=>把父类的”小型篮子“换成”大型篮子“,但还是只装5个”苹果“(将父类的引用指向子类,但父类只能调用父子自身的变量和方法),之后再用这个父类强制转换为另外一个子类<=>向”大型篮子“里面装入5个”西瓜“送给子类的引用;而将父类直接转换为子类<=>用父类的”小型篮子“装”5个苹果和5个西瓜“送给子类的引用(当然是装不下)请看如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace FatherAndSon
    {
        class ClassC
        {
            static void Main(string[] args)
            {   
                //先将子类强制转换为父类,然后用此父类强制转换为另外一个子类(通过)
                ClassB b = new ClassB();
                ClassA a = (ClassA)b;
                ClassB bbbbb = (ClassB)a;
    
               
                //(将父类直接强制转换为子类)编译能通过,运行通不过
                ClassA aa = new ClassA();
                ClassB bb = (ClassB)aa;
            }
           
        }
    
        class ClassA
        {
            
        }
        class ClassB : ClassA
        {
            
        }
    }
    
    

      另外一个值得非常注意的地方是:无论是子类强制转换赋给父类,还是父类(由子类强转得到)强制转换为子类;类对象是根据声明的类型(子类或父类)去调用其变量和函数的,与赋值无关。请看如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace FatherAndSon
    {
        class ClassC
        {
            static void Main(string[] args)
            {   
                //先将子类强制转换为父类,然后用此父类强制转换为另外子类(通过)
                ClassB b = new ClassB();
                b.PrintFunc();
                Console.WriteLine(b.myStr);
    
                ClassA a = (ClassA)b;
                a.PrintFunc();
                Console.WriteLine(a.myStr);
    
                ClassB bbbbb = (ClassB)a;
                bbbbb.PrintFunc();
                Console.WriteLine(bbbbb.myStr);
               
                //(将父类直接强制转换为子类)编译能通过,运行通不过
                //ClassA aa = new ClassA();
                //ClassB bb = (ClassB)aa;
                //bb.PrintFunc();
            }
           
        }
    
        class ClassA
        {
            public string myStr;
            public ClassA()
            {
                myStr = "Hello, This is myStr in ClassA";
            }
    
            public void PrintFunc()
            {
                Console.WriteLine("This is the Print Function in ClassA");
            }
        }
    
        class ClassB : ClassA
        {
            public string myStr;
            public ClassB()
            {
                myStr = "Hello, This is myStr in ClassB";
            }
            public void PrintFunc()
            {
                Console.WriteLine("This is the Print Function in ClassB");
            }
        }
    }
    
    

      上面代码输出的结果为:

        This is the Print Function in ClassB

        Hello, This is myStr in ClassB

        This is the Print Function in ClassA

        Hello, This is myStr in ClassA

        This is the Print Function in ClassB

        Hello, This is myStr in ClassB

      可以看出:类的实例对象在调用其变量和方法时,确实是以 声明 成为的类为依据的。

  • 相关阅读:
    【题解】 bzoj1191: [HNOI2006]超级英雄Hero (二分图)
    谈谈Android项目框架的前世今生
    十四个好用的开源漏洞检测工具
    关于Java导出100万行数据到Excel的优化方案
    逗号分割符--字段中含逗号等情况的解析方法Java实现
    Java日期处理
    服务器&浏览器伪装的故事
    浏览器User-agent简史(user-agent)
    修改tomcat服务器banner的方法
    life_motto
  • 原文地址:https://www.cnblogs.com/mingmingruyuedlut/p/1874204.html
Copyright © 2011-2022 走看看