zoukankan      html  css  js  c++  java
  • C#子类如何调用父类

    C#中子类是如何调用父类的?带着这个问题,体验如下:

     

    □ 通过子类无参构造函数创建子类实例

    创建父类Person和子类Student。

       public class Person
    
        {
    
            public Person()
    
            {
    
                Console.WriteLine("我是人");
    
            }
    
        }
    
        public class Student : Person
    
        {
    
            public Student()
    
            {
    
                Console.WriteLine("我是学生");
    
            }
    
        }
    

     

    在客户端通过子类无参构造函数创建子类实例。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                Student student = new Student();
    
                Console.ReadKey();
    
            }
    
        }

    输出结果:
    我是人
    我是学生

    可见:通过调用子类无参构造函数创建子类实例,会默认调用父类无参构造函数。

     

    如果把父类的无参构造函数去掉,会怎样呢?
    --结果会报"Person不包含0个参数的构造函数"错。

     

    □ 通过子类有参构造函数创建子类实例

    再同时为子类和父类添加有参构造函数。

        public class Person
    
        {
    
            public Person()
    
            {
    
                Console.WriteLine("我是人");
    
            }
    
            public Person(string name)
    
            {
    
                Console.WriteLine("我是人,我的名字叫{0}", name);
    
            }
    
        }
    
        public class Student : Person
    
        {
    
            public Student()
    
            {
    
                Console.WriteLine("我是学生");
    
            }
    
            public Student(string name)
    
            {
    
                Console.WriteLine("我是学生,我的名字叫{0}", name);
    
            }
    
        }
    

     

    在客户端通过子类有参构造函数创建子类实例。

     Student student = new Student("小明");
    
     Console.ReadKey();

    输出结果:
    我是人
    我是学生,我的名字叫小明

     

    可见:通过调用子类有参构造函数,同样默认会调用父类无参构造函数。

     

    □ 在子类中明确指出调用哪个父类构造函数

    以上,默认调用了父类的无参构造函数,但如何调用父类的有参构造函数呢?
    --在子类中使用base

     

    在子类Student中的有参构造函数中使用base,明确调用父类有参构造函数。

        public class Student : Person
    
        {
    
            public Student()
    
            {
    
                Console.WriteLine("我是学生");
    
            }
    
            public Student(string name)
    
                : base(name)
    
            {
    
                Console.WriteLine("我是学生,我的名字叫{0}", name);
    
            }
    
        }
    

    客户端

     Student student = new Student("小明");
    
     Console.ReadKey();

    输出结果:
    我是人,我的名字叫小明
    我是学生,我的名字叫小明

     

    □ 通过子类设置父类的公共属性

    在父类Person中增加一个Name公共属性,并在父类的构造函数中对Name属性赋值。

        public class Person
    
        {
    
            public string Name { get; set; }
    
            public Person()
    
            {
    
                Console.WriteLine("我是人");
    
            }
    
            public Person(string name)
    
            {
    
                this.Name = name;
    
                Console.WriteLine("我是人,我的名字叫{0}", name);
    
            }
    
        }
    

    在客户端:

    Student student = new Student("小明");
    
    Console.WriteLine("子类获取父类的Name属性值为{0}", student.Name);
    
    Console.ReadKey();    

    输出结果:
    我是人,我的名字叫小明
    我是学生,我的名字叫小明 
    子类获取父类的Name属性值为小明 

     

    以上代码的执行路径是:
    →调用子类有参构造函数,并把该参数传值给父类有参构造函数
    →调用父类有参构造函数,并给父类公共属性Name赋值
    →子类实例调用父类的公共属性

     

    其实,以上的做法在分层架构设计中已经得到了很好的使用。在分层架构中,通常会为所有的Repository创建一个基类,在基类中设计一个代表当前Repository的属性,并在基类的构造函数中为该属性赋值;最终,在创建子类Repository实例时,在为基类的、代表当前Repository的公共属性赋值。

     

    在子类中,当父类通过base拿到子类的参数时,还可以对该产生做一些处理,比如代表父类的base把从子类拿到的参数转换成大写。

         public class Student : Person
    
        {
    
            public Student()
    
            {
    
                Console.WriteLine("我是学生");
    
            }
    
            public Student(string name)
    
                : base(ConvertToUpper(name))
    
            {
    
                Console.WriteLine("我是学生,我的名字叫{0}", name);
    
            }
    
            private static string ConvertToUpper(string name)
    
            {
    
                return name.ToUpper();
    
            }
    
        }
    

    输出结果:
    我是人,我的名字叫DARREN
    我是学生,我的名字叫darren
    子类获取父类的Name属性值为DARREN

     

    总结:
    ● 通过子类无参构造函数创建子类实例,会默认调用父类的无参构造函数
    ● 通过子类有参构造函数创建子类实例,也会默认调用父类的无参构造函数
    ● 在子类构造函数中通过base关键字指明父类构造函数,当通过子类构造函数创建实例,会调用指明的、父类的构造函数
    ● 父类的公共属性可以通过子类来赋值,子类也可以获取到父类的公共属性

  • 相关阅读:
    ajax获取值的两种方法
    java反射
    idea 方便的设置代码段
    jstl核心标签库
    git遇到的问题 .Git: There is no tracking information for the current branch.
    java使用顺序存储实现队列
    RabbitMQ基本操作
    springboot 如何操作redis
    docker遇到的问题以及docker 操作镜像的基本操作
    教你在 Yii2 中添加全局函数
  • 原文地址:https://www.cnblogs.com/darrenji/p/3955305.html
Copyright © 2011-2022 走看看