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 修饰符 

  • 相关阅读:
    Hibernate使用笔记
    svn树冲突的解决方法
    SVN 清理失败的解决方法
    类的实现
    lua元表
    lua中table的常用方法
    C/C++作用域运算符::
    Cocos2d-x Lua 学习
    Lua学习
    吾 三十而望
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10526692.html
Copyright © 2011-2022 走看看