zoukankan      html  css  js  c++  java
  • C#(99):定义类成员(属性、方法、索引、运算符、事件)、接口实现

    一、类成员的访问级别

    • public:可由任何代码访问。
    • private(默认):只能由类中的代码访问。
    • internal:只能由它所在的项目(程序集)内部代码访问。
    • protected:只能由类和其派生类访问。
    • protected internal:只能由它所在的项目(程序集)或派生类的代码访问。

    二、定义字段

    class MyClass
    {
        public int MyInt;//公共字段
        int myInt;//私有字段
        public readonly int MyInt2 = 17;//只读成员,只能在声明时赋值或在构造函数中赋值。
        public static int myInt3;//静态字段,通过类访问。作用:1、记录一实例化对象的个数,2、存储必须在所有实例间共享的值。
        public const float PI = 3.14F;//常量,编译时就固定,一旦发生更改,需要重新编译,必须且只有在声明时初始化。
    }

    三、定义方法

    方法的继承修饰符:

    • virtual:方法可以重写。
    • abstract:方法必须重写,只用于抽象类。
    • override:重写一个基类方法。可以和sealed一起使用,应用在方法或属性,表示不能进一步的重写了。
    • extern:代码放于项目外,仅用于静态[DllImport]表示的方法。
    • static:方法只能通过类访问。静态方法和属性不能访问其基类的非静态成员,不能访问任何对象的实例变量。静态成员可继承。
    • new :隐藏基类成员。
    void Main()
    {
        A b1 = new B();//多态
        b1.M();//BM  
    
        B b2 = new B();
        b2.M();//BM  
    }
    
    abstract class A
    {
        public virtual void M()//虚拟方法,可继承
        {
            Console.Write("AM");
        }
    }
    
    class B : A
    {
        public override void M()// 重写了基类方法M
        {
            Console.Write("BM");
        }
    }

    无论基类是否为虚拟,派生类都可以用new 来隐藏。不覆盖基类方法,不影响基类的方法。可以用base.M()方式访问基类成员。

    void Main()
    {
        A b1 = new B();
        b1.M();//AM  
    
        B b2 = new B();
        b2.M();//BM  
    }
    
    abstract class A
    {
        public virtual void M()//虚拟方法,可继承
        {
            Console.Write("AM");
        }
    }
    
    class B : A
    {
        public new void M()// 重写了基类方法M
        {
            Console.Write("BM");
        }
    }

    四、定义属性

    属性的继承修饰符:virtual,abstract,override.

    • 只读属性:不顶用其中的get、set方即可。
    • 只写属性:用private修饰符对get、set方法进行保护。
    public class A
    {
        private int intVal;
        public int Val
        {
            get { return intVal; }
            set
            {
                if (value >= 0 && value <= 10)
                    intVla = value;
                else
                    throw new Exception("XX");
            }
        }
    }

    五、接口实现

    实现接口的类必须实现所有接口成员,且匹配指定的签名。接口成员默认是公共的。

    若要实现接口成员,类中对应的成员必须是公共的,非静态的,并且与接口成员集邮相同的名称和签名。

    interface IMyInterface //定义接口
    {
        int DoSth();//定义方法
        int IMyInt { set; get; }//定义属性
        event EventHandler Event;//定义事件
        string this[int index] { get; set; } //定义索引器
    }
    
    class MyClass : IMyInterface
    {
        private int _x;
    
        int IMyInterface.DoSth()   //显示接口实现
        {
            return _x;
        }
        public int IMyInt//隐式接口实现
        {
            get { return _x; }
            set { _x = value; }
        }
    
        public event EventHandler Event;
    
        protected void onEvent()
        {
            if (Event == null)
            {
                Event(this, EventArgs.Empty);
            }
        }
    
        public string this[int index]
        {
            get { return _x.ToString(); }
            set { _x = int.Parse(value); }
        }
    }

    1、显示接口实现,只能通过接口访问:

    MyInterface myClass=new MyClass();
    myClass.DoSth();

    2、隐式接口实现,既可通过类,也可通过接口访问。

    MyClass myClass=new MyClass();
    myClass.DoSth();

    六、定义索引器

    索引器indexer是一种特殊类型的属性。添加到类中,以提供类似于数组的访问。

    void Main()
    {
        MyClass myClass = new MyClass();
        myClass[0] = "d";
        Console.Write(myClass[0]);//d
        Console.Write(myClass[2]);//c
    }
    
    public class MyClass
    {
        private string[] arr = { "a", "b", "c" };
        public string this[int index]
        {
            get { return arr[index]; }//只有get,无set的索引为只读索引
            set { arr[index] = value; }
        }
    }

    七、运算符重载

    void Main()
    {
        MyClass myClass1 = new MyClass(500);
        MyClass myClass2 = new MyClass(200);
        Console.Write(myClass1 - myClass2);//300
    }
    
    public class MyClass
    {
        decimal weight;
        public MyClass(decimal weight)
        {
            this.weight = weight;
        }
        public static decimal operator -(MyClass a, MyClass b)
        {
            return a.weight - b.weight;
        }
    }

    八、定义事件

    void Main()
    {
        MyClass myClass1 = new MyClass();
        myClass1.myEvent += (sender, args) => { Console.Write(sender); };
        myClass1.TriggerEvent();//MyClass
    
    }
    
    public class MyClass
    {
        public event EventHandler<EventArgs> myEvent;//定义事件
        public void TriggerEvent()
        {
            EventHandler<EventArgs> temp = myEvent;
            if (temp != null)
                temp(this, EventArgs.Empty);//触发事件
        }
    }
  • 相关阅读:
    Java学习:Scanner类
    Java学习:Object类
    js 方法
    ToDictionary
    goto
    删除多列同时重复数据
    linq中使用case when
    sql 学习笔记
    VS2012发布网站详细步骤
    由于权限不足而无法读取配置文件出现的HTTP 500.19解决办法
  • 原文地址:https://www.cnblogs.com/springsnow/p/9428487.html
Copyright © 2011-2022 走看看