封装

封装的目的:防止对实现细节的访问,对外部访问做有效控制,维护数据的有效性,安全性

C#通过访问修饰符控制类成员的范围和可见性
C# 支持的访问修饰符如下所示:

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问,类的实例也无法访问该成员
  • protected:只有该类对象及其子类对象可以访问
  • internal:同一个程序集的对象可以访问;(同一程序集指namespace相同)
  • protected internal:访问限于当前程序集或派生自包含类的类型。

生动形象(
房子=namespace,B,D为A子类,A,B,C位于同一namespace下,D位于不同namespace下

继承

继承允许根据一个类来定义另一个类,有利于代码的重用.已有的类称为基类,新的类称为派生类.派生类会继承基类所有可继承成员

C# 不支持多重继承。但是可以使用接口来实现多重继承。一个类可以派生自一个类或多个接口,用逗号分隔

<访问修饰符> class <基类>
{
 ...
}
class <派生类> : <基类>,<接口1>,<接口2> 
{
 ...
}

多态

多态是同一个行为具有多个不同表现形式或形态的能力。
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

多态就是同一个接口,使用不同的实例而执行不同操作.

多态可以是静态或动态的.静态多态性函数相应发生在编译时,动态多态性函数响应发生在运行时

在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object。

静态多态

函数重载(overload)

在一个类里可以有多个函数名相同,参数不同(参数数量,参数类型),返回类型相同或不通过的方法

运算符重载

您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。

实例

	 using System;
	 namespace OperatorOvlApplication {
	 class Box {
	      private double length;      // 长度
	      private double breadth;     // 宽度
	      private double height;      // 高度
	      
	      public double getVolume()  {
	         return length * breadth * height;
	      }
	      public void setLength( double len )
	      {
	         length = len;
	      }
      public void setBreadth( double bre )
      {
         breadth = bre;
      }

      public void setHeight( double hei )
      {
         height = hei;
      }
      // 重载 + 运算符来把两个 Box 对象相加
      public static Box operator+ (Box b, Box c)
      {
         Box box = new Box();
         box.length = b.length + c.length;
         box.breadth = b.breadth + c.breadth;
         box.height = b.height + c.height;
         return box;
	      }

   }

   class Tester
   {
      static void Main(string[] args)
      {
         Box Box1 = new Box();         // 声明 Box1,类型为 Box
         Box Box2 = new Box();         // 声明 Box2,类型为 Box
         Box Box3 = new Box();         // 声明 Box3,类型为 Box
         double volume = 0.0;          // 体积

         // Box1 详述
         Box1.setLength(6.0);
         Box1.setBreadth(7.0);
         Box1.setHeight(5.0);

         // Box2 详述
         Box2.setLength(12.0);
         Box2.setBreadth(13.0);
         Box2.setHeight(10.0);

         // Box1 的体积
         volume = Box1.getVolume();
         Console.WriteLine("Box1 的体积: {0}", volume);

         // Box2 的体积
         volume = Box2.getVolume();
         Console.WriteLine("Box2 的体积: {0}", volume);

         // 把两个对象相加
         Box3 = Box1 + Box2;

         // Box3 的体积
         volume = Box3.getVolume();
         Console.WriteLine("Box3 的体积: {0}", volume);
         Console.ReadKey();
      }
   }
}
 </code></pre>

动态多态

重写(override)

使用抽象类,抽象方法以及需方法进行重写

重写的方法需加上关键字override

抽象类 抽象方法

C# 允许您使用关键字 abstract 创建抽象类与抽象方法,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

请注意,下面是有关抽象类的一些规则:

  • 您不能创建一个抽象类的实例。
  • 您不能在一个抽象类外部声明一个抽象方法。
  • 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法

抽象方法只能存在于抽象类中

抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

可以通过抽象类类型去引用具体的子类的实例,这样就可以忽略子类实际类型

虚方法

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。
虚方法可以在不同的继承类中有不同的实现。
对虚方法的调用是在运行时发生的。

抽象方法和虚方法的区别

  • 1.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
  • 2.抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。
  • 3.抽象方法必须在派生类中重写,这一点和接口类似,虚方法不需要再派生类中重写。

简单说,抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。抽象方法和虚方法都可以供派生类重写。

 posted on 2024-01-05 09:39  SilentVver  阅读(12)  评论(0)    收藏  举报