继承(1)-- C#系统学习
1.1 C#继承分为:实现继承 和 接口继承
实现继承:一个类型派生于一个基类型,拥有该基类型的所有属性和方法。在实现继承中,派生类型中的每个函数采用基类型的实现代码,除非重写基类型的方法。
如下例:
public class Base { public string sName; public string Fun() { return ""; } } public class Son : Base { }
类Son就拥有类Base中的sName属性和Fun方法。
接口继承:表示一个类型只继承了函数的签名,没有继承函数的任何代码。
例如:
public interface IDisposable { // 摘要: // 执行与释放或重置非托管资源相关的应用程序定义的任务。 void Dispose(); } class Son:IDisposable { }
接口继承常常被看作提供了一种契约:让类型派生于接口,来保证为客户提供某个功能。
1.2 多重继承
C#不支持多重实现继承。但是C#允许继承多个接口。
1.3 结构和类
结构不支持继承,结构派生于System.ValueType。
结构不支持实现继承,但支持接口继承。
可总结为:
结构总是派生于System.ValueType,他们还可以派生于任意多个接口。
类总是派生于用户选择的另一个类,他们还可以派生于任意多个接口。
2.1 虚方法(Virtual)
把一个基类函数声明为Virtual,该函数就可以在派生类中重写了。
class BaseClass { public virtual string VirtualMethod() { return "定义"; } } class DerivedClass : BaseClass { public override string VirtualMethod() { return "重新定义"; } }
注意 :成员字段和静态函数不能使用virtual,因为virtual只对类中的实例函数有意义。
2.2 隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,那么派生类方法就会隐藏基类的方法。
在编译的代码的时候,系统会发出警告,但是不会报错。 如果要消除警告,可以在派生类中的方法中使用 new 关键字,例如:
class BaseClass { public int Fun() { return 0; } } class DerivedClass : BaseClass { public new int Fun() { return 0; } }
2.3调用函数的基类版本
从派生类中调用方法的基类版本的方法是:base.<MethodName>()。
例如:假定派生类中的一个方法要返回基类的方法返回的值得90%。
class CustomerAccount { public virtual decimal CalcPrice() { return 0.0M; } } class GoldAccount : CustomerAccount { public override decimal CalcPrice() { return base.CalcPrice() * 0.9M; } }
2.4抽象类和抽象函数(abstract)
抽象类不能被实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。如果类中包含抽象函数,那么该类也将是抽象类
2.5 密封类和密封方法(sealed)
一般很少用,除非业务上需要,比如,禁止第三方以违反注册协议的方式扩展该类,其实密封类随处可见,string就是一个密封类,可以点击F12去查看string类的定义,就会发现是sealed的定义。
建议:尽量少用

浙公网安备 33010602011771号