zoukankan      html  css  js  c++  java
  • 13.C# 定义类成员

    1.定义字段

    class MyClass
    {
       public int MyInt;  
    }

    字段可以用readonly修饰,表示该字段只能在构造函数中赋值,还可以用static表示该字段是静态字段

    class MyClass
    {
        public int MyInt=17;//注意公共字段使用PascalCasing标准命名,即每个单词首字母大写
        private  int age=18; //私有变量用camelCasing标准命名,首字母小写,之后每个单词首字母大写
        public int StaInt =13;    
    }    

    2.定义属性

    class MyClass
    {
        private int myInt;
        public int MyInt{
            get{return myInt;}
            protected set { myInt=value;}//set访问器只当前类和继承该类的子类能访问
    }    }

    属性拥有两个类似函数的块,称为访问器,可以忽略其中一个访问器来创建只读或只写属性。访问器可以拥有自己的访问修饰符,但访问性不能高于它所属的属性。属性可以用abstract、virtual、override修饰,但不能用于字段。

    C#提供了一种定义属性的简写方式,可以不用定义私有字段,编译器会自动添加一个用于存储该属性的字段,但我们不知道该字段叫什么,无法直接对该字段进行修改。

    public int MyInt { get; set; }

    3.定义方法

        class MyClass
        {
            public void GetString()
            {
                Console.WriteLine("AAAA");
            }
        }

    方法可以用可访问修饰符public、protected、internal、private修饰,默认为private;非访问修饰符virtual、override、abstract、sealed、extern、static修饰,extern表示方法定义放在其他地方

    4.隐藏基类方法

    当基类的方法不像预期的那样工作时可以使用new关键字隐藏基类的方法,如

        class Program
        {
            static void Main(string[] args)
            {
                MyClass a = new MyClass();
                a.DoingSomething();//子类方法
                MyBaseClass b = a;
                b.DoingSomething();//基类方法
                Console.ReadLine();
            }
        }
    
        class MyBaseClass
        {
            public void DoingSomething()
            {
                Console.WriteLine("基类方法");
            }
        }
    
        class MyClass : MyBaseClass
        {
            public new void DoingSomething()
            {
                Console.WriteLine("子类方法");
            }
        }

    隐藏基类方法时,使用子类对象调用访问的是子类的方法,使用父类对象调用访问的是父类的方法,注意隐藏和重写的区别,重写时不管用子类还是父类对象调用方法,都将访问的是子类的方法(多态性),如下

        class Program
        {
            static void Main(string[] args)
            {
                MyClass a = new MyClass();
                a.DoingSomething();//子类方法
                MyBaseClass b = a;
                b.DoingSomething();//子类方法
                Console.ReadLine();
            }
        }
    
        class MyBaseClass
        {
            public virtual void DoingSomething()
            {
                Console.WriteLine("基类方法");
            }
        }
    
        class MyClass : MyBaseClass
        {
            public override  void DoingSomething()
            {
                Console.WriteLine("子类方法");
            }
        }

    5.调用重写或隐藏的基类方法

    有时候可能是在父类方法的基础上做修改,这样在重写方法时就需要调用父类的方法,可以使用base关键字调用重写的父类方法

    class MyBaseClass
        {
            public virtual string DoingSomething()
            {
                return "父类方法";
            }
        }
    
        class MyClass : MyBaseClass
        {
            public override string DoingSomething()
            {
                return base.DoingSomething()+ " 子类方法";
            }
        }

    注:base代表的是父类的对象实例,所以不能在静态方法中调用

    6.this 关键字

    this关键字代表当前类的对象实例,可以使用this关键字访问当前对象的实例成员。和base一样this不能用在静态方法中

        class MyClass
        {
            public  void DoingSomething(object o)
            {
                this.WriteSomething(this);//用this调用成员方法,并把当前对象实例传给该方法
            }
    
            public void WriteSomething(MyClass c)
            {
                Console.WriteLine(c.ToString());
            }
        }

    7.接口的实现

        interface IMyInterface
        {
            void DoingSomething();
            void DoingSomethingElse();
        }
    
        class MyClass : IMyInterface
        {
            public void DoingSomething()
            { 
            }
    
            public void DoingSomethingElse()
            {
            }
        }

    也可以在基类中实现接口成员,如

        interface IMyInterface
        {
            void DoingSomething();
            void DoingSomethingElse();
        }
    
        class MyBaseClass
        {
            public void DoingSomething()
            {
            }
        }
    
        class MyClass : MyBaseClass
        {
            public void DoingSomethingElse()
            {
            }
        }

    父类中实现了方法DoingSomething,子类只要实现剩余的方法即可

    以上两种方法是隐式的实现接口,下面是显示实现接口的方法

        interface IMyInterface
        {
            void DoingSomething();
            void DoingSomethingElse();
        }
    
    
        class MyClass : IMyInterface
        {
            void IMyInterface.DoingSomethingElse()
            {
            }
    
            void IMyInterface. DoingSomethingElse()
            {
            }
        }

    隐式实现接口和显式实现接口的区别在于:隐式实现接口需要用public修饰实现的成员,而显式实现的成员不能有访问修饰符修饰,并且需要用接口名.成员名限定实现的接口成员。

    除了语法上的区别外,显式实现的接口成员只能通过接口访问,隐式实现的成员可以通过接口和类来访问。即

    显式实现的接口成员只能用如下方式访问

                IMyInterface b = new MyClass();
                b.DoingSomething();

    隐藏实现的可以这两种方式都可以

                MyClass a = new MyClass();
               
                a.DoingSomething();//子类方法
    
                IMyInterface b = new MyClass();
                b.DoingSomething();

     8.嵌套类型的定义(内部类)

    C#类内部不仅可以定义方法、变量等成员,也可以在类内部定义类,此时内部类不仅能使用public、internal关键字修饰,还可以使用private、protected修饰

    public class MyClass
        {
            public class myNestedClass
            {
                public int nestedClassField;
            }
    
            public myNestedClass GetInternalClass()
            {
                return new myNestedClass();
            }
        }

    如果内部类是public或者internal的就可以在MyClass类外部定义内部类的实例,但必须用限定名称

     MyClass.myNestedClass n = new MyClass.myNestedClass();

    9.部分类

    C#可以使用部分类定义,把类的定义放在多个文件中。如把字段、属性和构造函数放在一个文件,而把方法放在另一个文件。部分类定义对于用来隐藏窗口布局代码非常有用

        public partial class MyClass
        {
            //类体
        }

    应用于部分类的接口会应用于整个类,下面两种方式是等价的

    方式一:

        public partial class MyClass:IMyInterface1
        {
            //类体
        }
    
        public partial class MyClass:IMyInterface2
        {
            //类体
        }

    方式2:

      public  class MyClass:IMyInterface1,IMyInterface2
        {
            //类体
        }

    10.部分方法

    可以在部分类中定义部分方法,在一个部分类中定义部分方法,但不包含方法体,在另一个部分类中包含实现代码

        public partial class MyClass
        {
            partial void MyPartialMethod();
        }
    
        public partial class MyClass
        {
             partial void MyPartialMethod()
             {
                
             }
        }

    部分方法可以是静态的,但是部分方法总是private,且不能有返回值,它们使用的参数也不能是out类型。因为部分方法如果没有方法体,编译器会完全删除该方法。如果方法有返回值,那么该方法就可以作为表达式的一部分,如

    int a =Func(a,b)

    如果Func是部分方法且没有方法体,那么编译器就不知道怎么执行上一句代码;同样如果输入参数是out类型,因为out类型的参数必须在方法体内赋值,如果没有方法体就会有问题。

    分部方法不能具有访问修饰符或 virtual、abstract、override、new、sealed 或 extern 修饰符 

  • 相关阅读:
    2020.10.23 19级training 补题报告
    2020.10.17 天梯赛练习 补题报告
    2020.10.16 19级training 补题报告
    2020.10.9 19级training 补题报告
    2020.10.10 天梯赛练习 补题报告
    2020.10.3 天梯赛练习 补题报告
    2020.10.2 19级training 补题报告
    第十届山东省ACM省赛复现补题报告
    VVDI Key Tool Plus Adds VW Passat 2015 Key via OBD
    Xhorse VVDI Prog Software V5.0.3 Adds Many MCUs
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10526692.html
Copyright © 2011-2022 走看看