.NET 面向对象基础

开发 后端
对象的内部数据不应该从对象的实例直接访问,如果调用者想改变对象的状态就要使用访问方法(getter)和修改方法(setter),封装提供了一种保护状态数据完整性的方法,可用于验证输入数据是否符合业务规则。

封装

 对象的内部数据不应该从对象的实例直接访问,如果调用者想改变对象的状态就要使用访问方法(getter)和修改方法(setter),封装提供了一种保护状态数据完整性的方法,可用于验证输入数据是否符合业务规则。

  • 实现方式
    • 访问方法和修改方法
    • 属性    

继承

 

新的类可以从其他类中继承利用他们既有的功能。这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。

  • 语法
  1. public class A 
  2.     public A() { } 
  3.  
  4. public class B : A 
  5.     public B() { } 

 

  • 代码重用
    • is-a:继承
    • has-a:包含、委托模型
  • 基类

 一个类只能有一个直接的基类,子类将继承基类的所有非私有功能,但可以继承多个接口,这样可以构造灵活的接口层次来建模复杂的行为。

  • 初始化调用

默认在子类的构造函数执行之前调用基类的构造函数,之后为基类的公共属性创建状态。实现子类时最好是显示的调用合适的基类的构造函数,减少对继承的初始化成员的调用次数。

 

 

 

 

  • 关键字
    • base:子类需要调用基类的字段或方法时可以使用该关键字
  • 密封类

密封类是不可以被继承的,在设计工具类时对类进行密封是很有意义的

 

 

 

 

  • 关键字
    • sealed
  • 代码示例
  1. public sealed class D 
  2.     // Class members here. 

 

  • 嵌套类

在类或结构内部定义的类型称为嵌套类型,不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。嵌套类型(或内部类型)可访问包含类型(或外部类型)。

  • 语法
  1. class Container 
  2.     class Nested 
  3.     { 
  4.         Nested() { } 
  5.     } 

 

 

  • 访问包含类型

将其作为构造函数传递给嵌套类型

  1. public class Container 
  2.     public class Nested 
  3.     { 
  4.         private Container m_parent; 
  5.  
  6.         public Nested() 
  7.         { 
  8.         } 
  9.         public Nested(Container parent) 
  10.         { 
  11.             m_parent = parent; 
  12.         } 
  13.     } 
  • 实例化

多态

通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。

  • 方法重写

由子类重新定义基类中的方法,可使用base关键字调用基类的方法

  • 关键字
    • virtual:基类中的需要子类实现的方法可以使用该关键字
    • override:派生类需要实现基类中的方法可以使用该关键字
  • 成员投影

如果子类中定义了一个成员与基类的成员一致,则我们称之为成员投影。可以使用new关键字调用新成员而不是被替换的旧成员,将子类实例强制转换成基类实例时才可以调用隐藏的基类成员。一般在无法更改基类代码的情况下可以使用此方法进行成员替换。

  • 关键字
    • new
  • 密封虚成员

用于密封从基类继承的虚方法,以防止本类的派生类重写此方法。

  • 关键字
    • sealed:使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员。
  • 代码示例
  1. public class D : C 
  2.     public sealed override void DoWork() { } 

 

抽象类

抽象类不能实例化,抽象类的用途是提供多个派生类可共享的基类的公共定义,可用于建模。
  • 关键字
    • abstract :使用 abstract 关键字可以创建仅用于继承用途的类和类成员,即定义派生的非抽象类的功能。
  • 抽象方法

抽象类也可以定义抽象方法。方法是将关键字 abstract 添加到方法的返回类型的前面。抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。

  • 代码示例
  1. public abstract class A 
  2.     public abstract void DoWork(int i); 

 

 

  • 虚方法声明为抽象

如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。

  1. // compile with: /target:librarypublic class D 
  2.     public virtual void DoWork(int i) 
  3.     { 
  4.         // Original implementation. 
  5.     } 
  6.  
  7. public abstract class E : D 
  8.     public abstract override void DoWork(int i); 
  9.  
  10. public class F : E 
  11.     public override void DoWork(int i) 
  12.     { 
  13.         // New implementation. 
  14.     } 
  • 多态接口
定义一个抽象类并定义许多抽象成员,这样派生类必须实现所有的抽象成员,也就强制了每一个后代具有的多态接口。     
  • 基类和派生类的转换规则
    • 规则一:可以使用基类保存任意的派生类型,并且这是安全的,这叫做隐式转换。
    • 规则二:反之,需要使用强制转换操作符进行显示的向下转换。

原文链接:http://www.cnblogs.com/liusuqi/p/3139726.html

责任编辑:陈四芳 来源: M守护神
相关推荐

2023-10-25 13:42:19

Java面向对象

2011-05-13 11:05:52

javascript

2011-05-13 09:58:46

javascript

2011-05-13 10:51:25

javascript

2011-05-13 11:27:59

javascript

2011-05-13 11:17:18

javascript

2011-05-13 12:38:58

javascript

2009-10-13 17:03:55

VB.NET面向对象

2009-11-02 16:22:16

VB.NET面向对象

2011-07-05 14:42:46

java

2010-01-13 11:18:24

VB.NET面向对象

2023-01-10 09:38:09

面向对象系统

2009-10-13 11:28:39

VB.NET面向对象编

2009-10-13 14:19:03

VB.NET面向对象编

2009-06-29 10:50:18

VB.NET面向对象能力

2010-01-12 18:05:38

VB.NET对象

2009-11-23 19:24:01

PHP面向对象编程

2020-10-20 08:35:34

JS基础进阶

2011-07-14 17:37:02

C++面向对象编程思想

2011-07-14 17:24:10

C++面向对象思想
点赞
收藏

51CTO技术栈公众号