zoukankan      html  css  js  c++  java
  • C#学习记录3上——类的封装,继承,多态

    OOP面向对象的三大特点:封装(encapsulation),继承(inheritance),多态(encapsulation)

    和JAVA与C++一样,C#也是OOP语言。并且,C#对数据的封装要比C++更好。另外,在C++里面可能习惯从main函数开始程序,类是作为主函数的一部分而存在的。而C#里面,所有的所有都是在某个类中进行。

    这里还是说C#较其他语言不一样的地方。

    有关类Class

    1.方法参数Arguments和传递参数Parameters

    首先说一下这两个词的区别。其实都是指参数,大多时候也都是互相通用。具体的,parameters指在声明方法的时候中的参数,而arguments指调用方法时传到方法中的参数。

    第一,关于可选(默认)变量:

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program obj = new Program();
     6             int num1 = 100, num2 = 200, num3 = 300;
     7             obj.PrintMethod(num1, num2, num3);
     8             obj.PrintMethod(num1);
     9             obj.PrintMethod(num1, arg3: num3);
    10             Console.ReadKey();
    11         }
    12         void PrintMethod(int arg1, int arg2=20, int arg3=30)
    13         {
    14             Console.WriteLine(arg1 + " " + arg2 + " " + arg3);
    15         }
    16     }

    PrintMethod方法参数列表里面有三个参数,后两个成为可选变量。也就是说,他们在方法被调用时可以填写也可不填。不填写则使用默认的值。

    可选变量在C#3.0里是不允许的,而到了4.0就可以使用了。注意,如果想要在调用的时候跳过某一个可选变量对后面的进行赋值,需要向上面第9行一样,用参数名:具体值得形式赋值。

    上面的运行结果

    第二,Passing by reference or by value

    相信这两个已经烂熟于心了吧。不多解释。C#一样是不加说明则按值,通过在parameter列表里加ref说明是按引用。

    除这两个之外,C#多了一种out参数。由于C#需要明确赋值,即变量须在使用之前进行赋值。所以如果将只声明而未赋值的变量按引用ref传到方法中,就会出现错误。这个out就是在这儿使用的,可以将未赋值的变量传入方法。

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program obj = new Program();
     6             int num1 = 100, num2;
     7             obj.ValueMethod(num1);
     8             Console.WriteLine("After By Value: " + num1);
     9             num1 = 100;
    10             obj.ReferenceMethod( ref num1);
    11             Console.WriteLine("After By Reference: " + num1);
    12             obj.OutMethod(out num2);
    13             Console.WriteLine("After By Out: " + num2);
    14             Console.ReadKey();
    15         }
    16         void ValueMethod(int arg1)
    17         {
    18             arg1 = 50;
    19         }
    20         void ReferenceMethod(ref int arg1)
    21         {
    22             arg1 = 50;
    23         }
    24         void OutMethod(out int arg1)
    25         {
    26             arg1 = 25;
    27         }
    28     }

    上面说的这些适用于除了引用类型的数据类型。引用类型有五种:class、interface、delegate、object、string

    并不是说引用类型就都是按照引用方式传递了,具体的当引用类型作为参数时:
    1、在修改变量本身时,结果类似于值传递,即不会改变传递前的变量的值
    2、在修改变量的属性或字段时,才是引用传递,会影响到传递前的变量的值
    3、参数使用了ref后,才是真正的引用传递,不管修改变量本身还是修改变量的属性或字段,都会影响到传递前的变量的值

    2.this指针

    为了明确一些名字的混淆问题,我们经常在类里面使用this指针,它指向当前对象(object)。不同的是C++里面this指针后要通过->来获得object里面的内容,而C#内可以直接通过.(dot)使用。(不刻意的区分指针和具体对象了)

    3.static

    静态的方法或成员变量在C#中必须只能直接通过类来访问,不允许通过具体该类的实例对象来访问。这一点要注意

    另外static方法中不可使用this,而静态方法只能访问静态成员变量。

    4.销毁对象

    C#想JAVA一样是隐式的进行垃圾回收。如果需要显示的释放空间,通过析构方法来进行。

    不过C#显示调用析构方法是不合法的。需要通过实现IDisposable接口,具体的添加Dispose方法。

    这里可以使用代码

     1 class SomeClass : IDisposable
     2 {
     3     bool is_disposed = false;
     4     protected virtual void Dispose(bool disposing)
     5     {
     6         if(!is_disposed)
     7         {
     8             if (disposing)
     9             {
    10                 Console.WriteLine("Not in destructor");
    11             }
    12             Console.WriteLine("Disposing...");
    13         }
    14         this.is_disposed = true;
    15     }
    16     public void Dispose()
    17     {
    18         Dispose(true);
    19         GC.SuppressFinalize(this);
    20     }
    21     ~SomeClass()
    22     {
    23         Dispose(false);
    24         Console.WriteLine("In destructor");
    25     }
    26 }

    5.通过属性进行数据封装

    在设计类的时候,我们总是希望将类的内部状态隐藏在类成员之间,通过方法来间接地访问。当是客户却总是希望直接访问这些属性。解决这个冲突的方法就是通过属性实现。

     1 public int Salary
     2 {
     3     get
     4     {
     5         return salary;
     6     }
     7     set
     8     {
     9         this.salary = value;
    10     }
    11 }

    通过get和set可以通过类似属性的方式来设置或访问具体内容

    6.readonly字段

    也就是constant

    被声明为readonly的值只能在声明时被赋值。如果是静态readonly值则还可以在static从constructor里赋值

  • 相关阅读:
    一个Work Stealing Pool线程池的实现
    一步一步解剖Libevent源代码
    一步一步学习堆排序算法
    一个通用的Makefile框架
    为什么我们知道那么多道理(理论),却依然处理不好目前的生活
    SQL
    走进Java Map家族 (1)
    Java数组协变与范型不变性
    尝鲜Java 12新特性:switch表达式
    android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)
  • 原文地址:https://www.cnblogs.com/sywang/p/4378867.html
Copyright © 2011-2022 走看看