• C#面向对象--类


      一、类(Class)是CTS中五种基本类型之一,是一种引用类型,封装了同属一个逻辑单元的数据(Data)和行为(Behavior),这些数据和行为通过类中的成员表示;使用class关键字定义类:

    //定义一个公共类MyClass
    public class MyClass
    {
        public int MyField; //声明一个int类型的公共实例字段
        public void MyFunc() //声明一个公共实例方法
        {
            /do…
        }
    }
    //创建类MyClass的实例并赋值给MyClass类型的变量myObj
    MyClass myObj = new MyClass();

      1.在命名空间中定义的类默认为内部类,即internal class,此时只有当前项目中的代码才能访问它;通常情况下会将类指定为公共类,即public class,此时可以由其他项目中的代码来访问它;

      ※在命名空间中定义的类只能为public或internal,在其它类型内部定义的类为该类型的嵌套类型,可以指定任何访问修饰符;

      二、在定义类时,还可以指定类是抽象类或密封类,二者不可同时指定;

      1.抽象类,即abstract class,不能被实例化,只能被继承;

      ※抽象类中可以声明抽象成员(只有抽象类中才可以声明抽象成员),也可以声明任意非抽象成员(虽然无法实例化,但可以声明构造函数和析构函数);抽象成员包括方法、属性、事件和索引器,抽象成员不提供实现,没有方法体,抽象成员不能是私有的,继承自抽象类的非抽象类必须通过关键字override实现基类中的抽象成员;

    public abstract class MyAbstractClass //定义一个公共抽象类MyAbstractClass
    {
        public abstract void MyFunc(); //声明一个公共抽象方法MyFunc
        public abstract int MyProperty //声明一个公共抽象属性MyProperty,声明抽象属性时只需要声明需要的访问器即可,在派生类中重写抽象属性时也只能重写抽象基类中存在的访问器
        {
            get;
        }
    }
    public class MyClass : MyAbstractClass //定义一个公共类MyClass继承自抽象类MyAbstractClass
    {
        public override void MyFunc() //实现抽象基类中的抽象方法
        {
            //do…
        }
        public override int MyProperty //实现抽象基类中的抽象属性
        {
            get;
        }
    }

      ※虽然抽象类不能直接通过new运算符实例化,但通过隐式转换可以将继承自抽象类的类的实例转换为抽象类的变量:

    MyAbstractClass myObj = new MyClass(); //创建MyClass类型的实例,隐式转换为MyAbstractClass

      ※抽象类同非抽象类一样可以继承其它任何可访问的非密封类,当抽象类继承的基类中包含虚方法时,抽象类可以使用抽象方法重写该虚方法,此时在抽象类的派生类中无法访问基类中的该虚方法,通过这种方式,抽象类可以强制派生类提供基类中该虚方法的新实现:

    public class MyClass
    {
        public virtual void MyFunc()
        {
            //do…
        }
    }
    public abstract class MyAbstractClass : MyClass
    {
        public abstract override void MyFunc();
    }
    public class MyDerivedClass : MyAbstractClass
    {
        public override void MyFunc()
        {
            //do…
        }
    }

      2.密封类,即sealed class,不能被继承;

    public sealed class MyClass { }

      ※密封类中不可以声明虚成员;如果声明了protected、protected internal或private protected成员会产生编译器警告CS0628;

      ※由于密封类从来不用作基类,所以有些运行时优化可以略微提高密封类成员的访问速度;

      三、在定义类时,还可以定义静态类,即static calss,静态类与非静态类基本相同,但存在以下区别:

      ※静态类不能实例化,默认即为密封的,不能被继承,静态类也不能继承其它类(默认继承自Object)或实现任何接口;

      ※静态类只能包含静态成员,始终使用类名访问静态类的成员;

      ※静态类不包含实例构造函数,但可以包含静态构造函数,与非静态类一样,静态类也只能声明一个无参的静态构造函数,不带访问修饰符也不含参数:static MyClass() { };

      ※在程序运行时,会在首次引用静态类之前初始化其字段并调用其静态构造函数,静态构造函数只调用一次,在程序所驻留的程序域的生存期内,静态类会保留在内存中


    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

    作者:Minotauros
    出处:https://www.cnblogs.com/minotauros/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    k8镜像
    幂等设计
    复杂思考,简单设计。 https://mp.weixin.qq.com/s/xmkFzEpzIauJgus3MMmkaQ
    GDP Streaming RPC 设计
    The zero value for a Mutex is an unlocked mutex. 零值
    reflect.DeepEqual 反射 比较值相等
    Go 和 C 的变量定义异同 nil 值判断 汇编
    https://www.luogu.com.cn/blog/wangrx/finitecalculus
    HTML a标签链接 设置点击下载文件 react 路由 静态路由 动态路由 虚拟路由
    Mars 微信跨平台跨业务基础组件
  • 原文地址:https://www.cnblogs.com/minotauros/p/12235933.html
Copyright © 2020-2023  润新知