zoukankan      html  css  js  c++  java
  • 类的声明-访问级别和类的继承-类成员的访问控制

    类声明

    类声明的位置

    1.命名空间内 2.创建另一个自己的命名空间 3.在命名空间外声明类,实际声明在全局命名空间 4. 在类内声明类,成为一个类的成员类

    声明即定义(c#,java)

    c,c++声明与定义分开,也可以合并在一起。

    最简单的类声明

    class-modifyers(opt类修饰符) class identify {class body}

    类修饰符

    new 适用于嵌套类
    internal(在类库内可访问),protected,internal,private 修饰符将控制类的可访问性
    abstract
    sealed
    static

    类的访问控制

    类成员的访问控制

    一个类库

    using System;
    
    namespace Mylib
    {
        public class Vehicle
        {
            public int MyProperty { get; set; }
        }
    }
    

    主函数

    using Mylib;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Vehicle vehicle = new Vehicle();
                vehicle.MyProperty = 100;
                System.Console.WriteLine(vehicle.MyProperty);
             
           
            }
        }
    }
    
    

    如果将类库里的成员函数的访问级别设为internal(默认为internal),那么尽管这个类是public,他的成员却无法访问
    类库里的成员若为private,则类外继承的子类无法访问父类的成员(protected和public可以)

    protected将访问级别控制在继承链上。
    访问级别还可以进行组合……

    类的继承

    基类-派生类 (父类-子类)
    如果类没有继承,那么默认继承与system.object类。system.object无基类。
    子类的实例也是父类的实例。可以用父类型的变量去引用子类的实例。子类的访问级别不能超越基类的访问级别。只能有一个基类,但是可以实现多个基接口。
    继承的本质:派生类在基类已有的成员基础之上,对基类进行的横向和纵向上的扩展:

    1.子类完整接受父类成员
    静态类型语言(c++,c#,java)中,类成员一旦被引入继承链当中,他就会永远的向下传递,不能移除 .动态类型(python,javascript)可移除。
    横向-类成员在数量上的扩充,纵向-类的更新迭代。

    从基类构造器开始,先构造基类对象,然后一级一级往下构造,如果基类构造器带参数,那么子类也应该带参数。
    特别注意的是,构造器是不被继承的,完全继承的是方法,属性,事件等。当出现基类构造器带参数时,采用以下两种方法

    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Car car = new Car();
                car.show();
                Console.WriteLine(car.MyProperty);
                
            }
        }
    
        class Vehicle
        {
            public Vehicle( int content)
            {
                this.MyProperty = content;
    
            }
            public int MyProperty { get; set; }
    
        }
    
        class Car : Vehicle
        {
            public Car() : base(125)//1.
            {
                this.MyProperty = 2;
            }
            public Car(int content):base(content)//2.
            {}
            public void show()
            {
                Console.WriteLine(base.MyProperty);
            }
    
        }
    }
    

    面向对象的分格

    class-based 基于类的继承封装多态
    prototype-based 基于原型的继承封装多态(javascript)

  • 相关阅读:
    py 6.4
    py 5.31
    Java集合之LinkedHashMap常用方法解析
    Java集合之HashMap常用方法解析
    Java集合之LinkedList常用方法解析
    Java集合之ArrayList常用方法解析
    Java 基础知识
    Java wait和notifyAll的使用,简单的阻塞队列实现
    The main resource set specified [/tmp/tomcat-docbase.5063501203886177649.7000] is not valid
    zuul网关过滤器实现对GET请求的参数替换
  • 原文地址:https://www.cnblogs.com/lpxspring/p/12393901.html
Copyright © 2011-2022 走看看