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();
            }
           
        }
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10488781.html
Copyright © 2011-2022 走看看