继承

一、继承的类型
1.1 实现继承和接口继承
C#中既有实现继承,也有接口继承。它们没有强弱之分,因为两种继承都完全内置于语言,因此很容易为不同的情形选择最好的体系结构。
实现继承:表示一个类型派生于一个基类型,拥有该类型的所有成员字段和函数。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现。在需要指定该类型具有某些可用的特征时,最好使用这种类型的继承。接口继承常常被看做提供了一种契约:通过类型派生于接口,从而保证为客户提供某个功能。
1.2 多重继承
 C#不支持多重实现继承,但允许类型派生于多个接口。所以C#类可以派生于另一个类和任意多个接口。
1.3 结构和类
前面说过了结构是值类型,不支持继承,但是每个结构都自动派生于System.ValueType。实际上,不能建立结构的类型层次,但结构可以实现接口。
二、实现的继承
类派生于另一个类,语法如下:

None.gif class  MyDerivedClass:MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
//function and data members here
ExpandedBlockEnd.gif
}
C#不支持私有继承,所以基类名上没有public或private限定符。
类派生于接口,则用都好分隔。
2.1 虚方法
在C#中可以把在方法或者属性的前面加上virtual,声明基类的方法为虚方法或者虚属性,虚方法和虚属性的规则相同。语法如下:
None.gif class  MyBaseClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public virtual string VirtualMethod()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif     
return "this method is virtual and define in MyBaseClass";
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}
在C#中,方法在默认的情况下不是虚拟的,但(除构造函数以外)可以显示的声明。派生类重写基类的虚方法时,要使用override关键字显示声明:
注意:成员字段和静态函数不能被声明为virtual,因为这个概念只对类中的实例函数成员有意义。
2.2 隐藏方法
如果在基类和派生类中都声明了签名相同的方法,而基类中的方法又没有声明为virtual,派生类中的方法也没有声明成override,则派生类方法就会隐藏基类方法。结果是调用哪个类的方法取决于引用实例的变量类型,而不是实例本身的类型。
2.3 调用函数的基本版本
C#有一种特殊的语法用于从派生类中调用方法的基本版本:base.<MethodName>()。
2.4 抽象类和抽象函数
C#中的抽象类要声明为abstract,抽象类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。显然抽象函数也是虚拟的,但不需要提供virtual关键字,而用abstract关键字。如果类包含了抽象函数,那么该类也是抽象的,类必须用abstract声明。
None.gif absttact  class  Building
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
public abstract decimal CalculateHeatingCost();//abstract method
ExpandedBlockEnd.gif
}
2.5 密封类和密封方法
C#允许把类和方法声明为sealed,对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。
None.gif sealed   class  FinalClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}
2.6 派生类的构造函数
在创建派生类的实例时,实际上会有多个构造函数在起作用。实例化类的构造函数本身不能初始化类,还必须调用基类中的构造函数。即派生类的实例构造是按层次结构进行的,顺序是先执行基类的构造函数,再执行派生类的构造函数。
基类的构造函数总是最先调用,那么派生类的构造函数可以在执行的过程中调用基类的方法、属性和其他成员,因为基类已经构造出来了,其他字段也初始化了。
None.gif // 在结构层次中添加无参数的构造函数
None.gif
public   abstract   class  GenericCustomer
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
private string name;
InBlock.gif  
public GenericCustomer():base()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    name 
= "myName";
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif
None.gif
// 在结构层次中添加带参数的构造函数
None.gif
public   class  Nevermore60Customer:GenericCustomer
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
private int highCost;
InBlock.gif  
public Nevermore60Customer(string name):base(name)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
this.highCost = 0;
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}
三、修饰符
C#中完整的修饰符列表:
修饰符应用于说明
public所有类型或成员任何代码均可以访问该方法
protected类型和内嵌类型的所有成员只有派生的类型能访问该方法
internal类型和内嵌类型的所有成员只能在包含它的程序集中访问该方法
private所有类型或成员只能在它所属的类型中访问该方法
protected internal类型和内嵌类型的所有成员只能在包含它的程序集中和派生类型的代码中访问该方法

四、接口
接口中只能包含方法、属性、索引器和事件的声明。接口不能实例化,不能有构造函数或字段,也不包含运算符重载。接口定义中还不允许声明成员的修饰符,成员接口总是public的,不能声明成virtual或者static
4.1 接口的定义和实现
None.gif // 定义
None.gif
namespace  InterfaceTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
public interface IBankAccount
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
void PayIn(decimal amount);
InBlock.gif    
bool Withdraw(decimal amount);
InBlock.gif    
decimal Balance
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
get;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif
None.gif
// 实现
None.gif
namespace  InterfaceTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
public class SaverAccount:IBankAccount
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
private decimal balance;
InBlock.gif    
public void PayIn(decimal amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      balance 
+= amount;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public bool Withdraw(decimal amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
if(balance >= amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        balance 
-= amount;
InBlock.gif        
return true;
ExpandedSubBlockEnd.gif      }

InBlock.gif      Console.WriteLine(
"Withdrawal attempt failed.");
InBlock.gif      
return false;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public decimal Balance
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
get
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        
return balance;
ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public override string ToString()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
return String.Format("Venus Bank Saver:Balance = {0,6:C}",balance);
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif
4.2 派生的接口
接口可以继承,其方式与类的继承相同。

转载于:https://www.cnblogs.com/justnow/archive/2007/01/26/627703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值