zoukankan      html  css  js  c++  java
  • 9.C# 类

    1.类定义格式

    【访问修饰符】class 类名 【:父类名,接口名,接口名】

    {

      //类成员

    }

    类的访问修饰符有public、internal两个,没有标明访问修饰符默认为internal,被internal修饰的类只能在当前项目中访问,即只能在同一个程序集中访问;public 修饰的类可以被其他项目中的代码访问。类成员默认的访问修饰符是private。除了可访问修饰符之外,还可以使用abstract 标明类是抽象的,用sealed标明类是密封的,不能继承的,如

    public abstract A

    {

      //类成员

    }

    C#使用:表示继承,每个类只能继承一个父类,且必须放在冒号后面;可以继承多个接口,接口放在父类后面,多个接口用逗号隔开。如果类定义时没有指定继承的父类,那么当前类默认继承System.Object类。继承时派生类的可访问行不能高于父类,否则编译不通过,如下定义是错误的

    internal class A
    {
            
    }    
    
    public class B:A
    {
            
    }    

    2.接口的定义

    【访问修饰符】interface 接口名【:接口1,接口2】
    {
        
    }

    注:不能使用abstract修饰接口,接口成员本身就是抽象的,也不能使用sealed,因为接口必须继承并且实习其类成员。接口不是类,所以没有继承System.Object类。接口不能直接实例化

    接口成员不能用访问修饰符修饰,默认是public,但是不能用public修饰。接口不能包含字段,但是可以包含属性,如下面定义将提示接口不能包含字段

     interface IHotDrink
        {
            
            bool Milk ;
    
            int Sugar;
    
            int AddSugar(int amount);
        }

    正确的定义是把字段定义成属性,如

     interface IHotDrink
        {
            /// <summary>
            /// 是否加牛奶
            /// </summary>
            bool Milk { get; set; }
    
            /// <summary>
            /// 加糖的数量(块),如加了两块方糖
            /// </summary>
            int Sugar { get; set; }
    
            int AddSugar(int amount);
        }

    3.接口的实现

    继承接口的类必须实现接口定义的属性和方法,且不能降低接口成员的访问性,即必须用public修饰

    interface IHotDrink
        {
            /// <summary>
            /// 是否加牛奶
            /// </summary>
            bool Milk { get; set; }
    
            /// <summary>
            /// 加糖的数量(块),如加了两块方糖
            /// </summary>
            int Sugar { get; set; }
    
            int AddSugar(int amount);
        }
    
        class CupofCoffee : IHotDrink
        {
            private bool _Milk;
            public bool Milk//实现接口属性
            {
                get { return _Milk; }
                set { _Milk = value; }
            }
            private int _Sugar;
            public int Sugar
            {
                get { return _Sugar; }
                set { _Sugar = value; }
            }
    
            private string _BeanType;
            /// <summary>
            /// 咖啡品牌
            /// </summary>
            string BeanType
            {
                get { return _BeanType; }
                set { BeanType = value; }
            }
    
            public int AddSugar(int amount)//实现接口方法
            {
                Sugar += amount;
                return Sugar;
            }
        }

    4.System.Object类

     因为C#中所有的类都直接或者间接继承System.Object类,所以所有类都可以访问Object类中的受保护的和公共的成员。Object类常用的成员有:

    1)public Object()

    System.Object类的构造函数,派生类的构造函数会自动调用这个方法。

    2)~Object()

    System.Object类的析构函数,也称为Finalize()(终结函数),派生类的析构函数自动调用,不能手动调用。析构函数只能由垃圾回收器调用

    3)public virtual bool Equals(Object o)

    把调用该方法的对象和另一个对象比较,如果他们是同一个实例,即指向同一个地址空间则返回true,如果只是想比较两个对象的值是否相等可以重写这个方法

                A a = new A();
                A b = new A();
                A c = a;
                Console.WriteLine(a.Equals(b));//false
                Console.WriteLine(a.Equals(c));//true

    4)public static bool Equals(object objA, object objB)

    比较两个对象是否同一个引用,比较时调用了Equals(object)方法,所以如果重写了Equals(object)方法,那么这个方法比较的结果也会随之改变。如果obA 和objB都为null返回true

    class A
        {
            
            //重写Equals方法,比较两个对象是否是同一个类的实例
            public override bool Equals(object obj)
            {
                return (this.GetType()==obj.GetType());
            }
        }
    
     static void Main(string[] args)
            {
                A a = new A();
                A b = new A();
                A c = a;
                Console.WriteLine(a.Equals(b));//true
                Console.WriteLine(a.Equals(c));//true
                Console.WriteLine(A.Equals(a,b));//true
                Console.ReadLine();
            }

    5)public static bool ReferenceEquals(object objA, object objB)

    比较两个对象是否是同一引用,如果是或者两个都是null返回true

    6)public virtual string ToString();

    返回当前对象的类名,可以重写它返回自己想要的内容

    class A
        {
           
            public string ToStringOld()
            {
                return base.ToString();
            }
    
            public override string ToString()
            {
                return "这类A";
            }
        }
    
    static void Main(string[] args)
            {
                A a = new A();
    
                Console.WriteLine(a.ToString());//重写后返回这类A
                Console.WriteLine(a.ToStringOld());//没重写时返回命名空间.类名: ConsoleApplication1.A
              
                Console.ReadLine();
            }

    6)public Type GetType()

    以System.Type对象的形式返回对象的类型

    7)public virtual int GetHashCode()

    用作对象的散列函数,这是一个必选函数,返回一个以压缩形式标识的对象状态的值,即对象的哈希代码

    假设两个对象的比較结果相等,则每一个对象的 GetHashCode 方法都必须返回同一个值。可是,假设两个对象的比較结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
    一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有改动过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次执行该应用程序时可能会返回还有一个哈希代码。

    GetHashCode方法的作用参考https://blog.csdn.net/cnhk1225/article/details/23391885

    8)protected object MemberwiseClone()

    通过创建一个新对象实例并复制成员,以复制该对象。成员的拷贝不会得到这些成员的新实例,新对象的引用类型的成员都将引用和原对象同样的对象。因为这个方法是受保护的,所以只能在派生类中使用

    class A
        {
           
        }
    
    
        class B : A
        {
            public C c = new C();
            public int age;
    
            public B Clone()
            {
                return (B)this.MemberwiseClone();
            }
    
    
        }
    
        class C 
        {
            public int grade;
        }
    
        class Program
        {
            private static object lokk = new object();
    
            static void Main(string[] args)
            {
    
    
                B a = new B();
                B b = a.Clone();
                Console.WriteLine(b.Equals(a));//false 说明不是同一个实例
                Console.WriteLine(b.c.Equals(a.c));//true 说明是c对象同一个实例,指向同一个地址
                Console.WriteLine(a.c.grade);//0
                b.c.grade = 2;
                Console.WriteLine(a.c.grade);//2说明a.c和b.c指向同一个地址空间
    
                Console.ReadLine();
            }
           
        }
  • 相关阅读:
    C#中泛型类,泛型方法,泛型约束实际应用
    Sql语法高级应用之七:如何在存储过程中使用事务
    再探motan
    终于好像懂motan了!!!
    java 反射详解
    设计模式之一工厂方法模式(Factory Method)
    记一次CPU占用率和load高的排查
    浅谈反射性能
    短网址服务(TinyURL)生成算法
    记一次阿里云中间件面试
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10488781.html
Copyright © 2011-2022 走看看