C#继承和多态



sealed关键字

如果我们将类标记为sealed,编译器将不会允许我们从这个类型派生。(C#结构总是隐式密封的。因此,我们永远不可以从结构继承结构,从类继承结构或从结构继承类。结构只能用于建模独立的、用户定义的数据类型。如果希望是is-a关系,就必须使用类。)

使用base关键字控制基类的创建

protected关键字

派生类型不再需要使用公共方法或属性来间接访问数据了。当然,可能的坏处在于:如果派生类型有权直接访问其父类内部数据,有可能会偶尔绕过公共属性内设置的既有业务规则。当定义受保护成员时,也就创建了一种父类和子类之间的信任级别,编译器不会捕获任何违背类型业务规则的异常。

包含/委托编程

class BenefitPackage

{

public  double  ComputePayDeduction()

{  return 125.0;  }

}

partial class Employee

{

protected BenefitPackage  empBenefits=new BenefitPackage();

public double GetBenefitCost()

{   return empBenefits.ComputePayDeduction();  }

public BenefitPackage Benefits

{   get { return empBenefits;  }

set { empBenefits=value;  }

}

.......

}

嵌套类型

public class OuterClass

{

//公共嵌套类型可以被任何人使用

public class PublicInnerClass { }

//私有嵌套类型只可以被包含类的成员使用

public class PrivateInnerClass { }

}

嵌套类型的特征:

通过嵌套类型可以完全控制内部类型的访问级别,也就是可以声明为私有的(回忆一下,非嵌套类不能使用private关键字来声明)。

由于嵌套类型是包含类的成员,所以它可以访问包含类的私有成员。

通常,嵌套类型只用做外部类的辅助方法,而不是外部世界所准备的。

//Employee嵌套BenefitPackage

public partial class Employee

{

// BenefitPackage嵌套BenefitPackageLevel

public class BenefitPackage

{

public enum BenefitPackageLevel

{   Standard,Gold,Platinum  }

}

public double ComputePayDeduction()

{  return 125.0  }

}

在这种嵌套关系里需要注意如何使用枚举:

Employee.BenefitPackage.BenefitPackageLevel myBenefitLevel=Employee.BenefitPackage.BenefitPackageLevel.Platinum;

virtual和override关键字

多态为子类提供了一种方式,使其可以定义为由其基类定义的方法,这种过程叫做方法重写。

partial class Employee

{

poblic virtual void GiveBonus(float amount)

{  Pay+=amount ; }

......

}

用virtual关键字标记的方法成为虚方法。

如果子类希望改变虚方法的实现细节,就必须使用override关键字。

class SalesPerson:Employee

{ .......

//销售人员的奖金受销量的影响

public override void GiveBonus(float amount)

{

int salesBonus=0;

if(numberOfSales>=0&&numberOfSales<=100)

salesBonus=10;

else

{  if(numberOfSales>=101&&numberOfSales<=200)

salesBonus=15;

else

salesBonus=20;

}

base.GiveBonus(amount*salesBonus);

}

}

class Manager:Employee

{ .......

public override void GiveBonus(float amout)

{    base.GiveBonus(amount);

Random r=new Random();

numberOfOptions+=r.Next(500);

}

}

密封虚成员

class SalesPerson:Employee

{  ........

public override sealed void GiveBonus(float amount)

{  .......  }

}

sealed class PTSalesPerson:SalesPerson

{ .......

public PTSalesPerson(string fullName,int age,int empID,float currPay,string ssn,int numbOfSales)

:base(fullName,age,empID,currPay,ssn,numbOfSales)

{  }

// 编译器错误!不能在PTSalesPerson类中重写这个方法,因为它是被密封的

public override void GiveBonus(float amount)

{   }

}

抽象类

由于很多基类都是比较模糊的尸体,好的设计师会防止在代码中直接创建新的Employee对象。

abstract partial class Employee

{   ........  }

构建多态接口

成员投影

基类/派生类的转换规则

as关键字

//我们不能强制转换frank为Hexagon,但编译没问题

Hexagon hex=(Hexagon)frank;

//使用“as”来测试兼容性

Hexagon hex2=frank as Hexagon;

if(hex2==null)

Console.WriteLine("Sorry,frank is not a Hexagon...");

is关键字

除了is关键字,C#语言还提供了is关键字来测试两个项是否兼容。然而,和as关键字不同的是,如果类型不兼容,is关键字就返回false而不是null引用。

超级父类:System.Object

System.Object的核心成员

Equals() 默认情况下,如果被比较的项指向内存中同一个项,则方法会返回true。因此,Equals()用于比较对象引用,而不是对象的状态。一般情况下,这个方法被重写为:如果被比较的对象有相同的内部状态值(也就是基于值的语义),则返回true。要知道,如果重写Equals(),则还需要重写GetHashCode(),因为这些方法在内部用于Hashtable类型从容器读取子对象。ValueType类为所有结构重写了该方法,它们进行的比较是基于值的。

Finalize() 这个方法(在重写后)在对象销毁之前被调用来释放所分配的资源。

GetHashCode() 这个方法返回int来标识指定的对象实例。

ToString() 这个方法是用<namespace>,<type name>格式(叫做完全限定名)返回对象的字符串表示。这个方法可以被子类重写来返回名称/值对的标识字符串以表示对象的内部状态,而不是它的完全限定名。

GetType() 这个方法返回Type对象,它完整描述当前指向的对象。简而言之,这是所有对象都可用的运行时类型标识方法。

MemberwiseClone() 这个方法的作用是逐个成员地返回当前对象的副本,通常用于克隆对象。

时间: 2024-10-07 23:51:49

C#继承和多态的相关文章

2、C#面向对象:封装、继承、多态、String、集合、文件(上)

面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. 打包,便于管理,为了解决大型项目的维护与管理. 三.什么是类? 将相同的属性和相同方法的对象进行封装,抽象出 “类”,用来确定对象具有的属性和方法. 类.对象关系:人是类,张三是人类的对象. 类是抽象的,对象是具体的.对象可以叫做类的实例,类是不站内存的,对象才占内存. 字段是类的状态,方法是类执

Java的继承与多态

Java的继承与多态对于提高开发效率,减少开发量,是非常有帮助的,也便于代码维护.下面是根据书上讲的,我又做了改进的例子. 假设需求: 公司需要对所有人员进行管理,所有人员分为普通员工和经理人,他们的头衔.工资.生日等信息都是不一样的,但是不能开发两套系统分别进行管理,而是要一套系统完成对所有人的管理. 设计一个员工类,这是父类,定义如下: package com.myHelloWorld; import java.text.ParseException; import java.text.Si

Java 继承、多态与类的复用

摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了它的实现机制和详细应用.此外,为了更好地理解继承和多态.我们对final关键字进行了全面的介绍. 在此基础上.我们介绍了Java中类的载入及初始化顺序.最后.我们对面向对象设计中三个十分重要的概念–重载.覆盖与隐藏进行了详细的说明. 要点: 继承 组合,继承,代理 多态 final 关键字 类载入及

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

Objective-C的封装、继承与多态

面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐藏对象的实现细节,不让用户看到,以此来增强安全性和简化编程,进而达到封装的目的. 使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员. 访问修饰符:private.protect.public private:私有的,不可供外部访问的信息,只有类本身能存取. prot

【转】C#三大特性之 封装、继承、多态

C#三大特性之 封装.继承.多态 一.封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型.  封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改. 封装提供了一个有效的途径来保护数据不被意外的破坏.相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fie

Objective--C三大特性:封装,继承,多态(杂乱的东西)

OC中类的特性共有有三个,它们分别是封装.多态和继承. 1.成员变量的作用域.成员变量的作用域应该也是封装的一种,它对成员变量的作用范围做出了一些限制. @public : 在任何地方都可以直接访问成员变量. @protected:在本类和子类中可以直接访问. @private:只能在本类中访问. @package:在同一个框架内可以访问. 默认情况下在类的声明中定义的成员变量的修饰符是@protected,在类的实现中定义的成员变量的修饰符是@private. 总结:(1)封装是为了保护类中的

C++编程实践: 继承与多态

本实例及代码来自<C++ Primer Plus>(第六版) 第十三章 题目要求: 假如你是某银行首席程序员.银行要求你开发两个类,一个用于表示基本支票账户--Brass Account,另一个用于表示代表Brass Plus支票账户,它添加了透支保护的特性.也就是说,如果持有此卡的用户签出了一张超出其存款余额的支票--但是超出的数额并不是很大,银行将支付这张支票,对超出的部分收取额外的费用,并追加罚款. 下面是用于Brass Account支票账户的信息: 客户姓名 帐号 当前结余 下面是可

Objective-C 继承和多态

学习Java我们知道类有三大特征,封装,继承,多态.而在Objective-C中也有继承的概念,今天就来看看Objective-C中的继承和多态. 首先,我们来看看示例代码: //Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject { int food_consumption; //食量 int count; //数量 int parturition_days; //生产周期 } -(int)count

C++_基础_继承、多态

内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的拷贝构造和拷贝赋值可能也需要显式的指定父类子对象的拷贝构造和拷贝赋值的方式 2.多继承和虚继承2.1 格式: class 子类名 : 继承方式 父类名1,继承方式 父类名2,... { //子类中的属性和行为 }; 如: 员工类 / \销售员工类 管理者类 \ / 销售管理类 叫做:钻石继承 2.2