虚方法和覆写方法

虚方法可以使基类的引用访问"升至"派生类中

可以使用基类引用调用派生类的方法,只需满足下面的条件

  • 派生类的方法和基类的方法有相同的签名和返回类型
  • 基类的方法使用virtual标注
  • 派生类的方法使用override标注
  class Program
{
static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}
} class MyBaseClass //基类
{
virtual public void Print()
{
Console.WriteLine("基类");
}
} class MyDerivedClass : MyBaseClass //派生类
{
public override void Print()
{
Console.WriteLine("派生类");
}
}

上面代码阐明了virtual和override方法。

关于virtual和override的信息如下

  • 覆写和被覆写的方法必须有相同的可访问性
  • 不能覆写static方法或非虚方法
  • 方法,属性和索引器,事件都可以被声明为virtual和override

覆写标记为override的方法

  • 当使用对象的基类部分的引用调用一个覆写方法时。方法的调用被沿派生层上溯执行,一直到标记为override的方法的最高派生版本
  • 如果在更高的派生级别有该方法的其他声明,但没有被标记为override,那么它们不会别调用
class MyBaseClass  //基类
{
virtual public void Print()
{
Console.WriteLine("基类");
}
} class MyDerivedClass : MyBaseClass //派生类
{
public override void Print()
{
Console.WriteLine("派生类");
}
}
class SecondDerived : MyDerivedClass//最高派生类
{
//to
}

情况1:使用override声明print

如果把SecondDerived的Print方法声明为override,那么他会覆写方法的全部两个派生级别的版本

class SecondDerived : MyDerivedClass//最高派生类
{
public override void Print()
{
Console.WriteLine("第二派生类");
}
} static void Main(string[] args)
{
SecondDerived derived = new SecondDerived();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}

情况2:使用new声明Print

 class SecondDerived : MyDerivedClass//最高派生类
{
new public void Print()
{
Console.WriteLine("第二派生类");
}
} static void Main(string[] args)
{
SecondDerived derived = new SecondDerived();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}

覆盖其他成员类型

 class MyBaseClass  //基类
{
//virtual public void Print()
//{
// Console.WriteLine("基类");
//} private int _myInt = ;
virtual public int Myproerty
{
get { return _myInt; }
}
} class MyDerivedClass : MyBaseClass //派生类
{
//public override void Print()
//{
// Console.WriteLine("派生类");
//}
private int _myInt = ;
public override int Myproerty
{
get
{
return _myInt;
}
}
} static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
Console.WriteLine(derived.Myproerty);
Console.WriteLine(mybc.Myproerty);
Console.ReadLine();
}

构造函数的执行

要创建对象的基类部分,需要隐试调用基类的某个构造函数作为创建实例过程的一部分

继承层次链中的每个类在执行自己的构造函数体之前执行他的基类构造函数

 class MyBaseClass  //基类
{
public MyBaseClass()//2 基类构造函数调用
{ }
} class MyDerivedClass : MyBaseClass //派生类
{ int _myInt = ; //1 成员初始化
public MyDerivedClass() //3 构造函数体执行
{ } }

构造函数初始化语句

有两种形式的构造函数初始化语句

  • 第一种形式使用关键字base并指明使用哪一个基类构造函数
  • 第二种形式使用关键字this并指明应该使用当前类的哪一个构造函数

抽象成员

抽象成员是指被设计为被覆写的函数成员

抽象成员的特征

  • 必须是一个函数成员,也就是说,字段和常量不能为抽象成员
  • 必须用abstract修饰符标记
  • 不能有实现代码块。抽象成员的代码用分号表示

抽象成员只可以在抽象类中声明,一共有4种类型的成员可以声明为抽象的

  1. 方法
  2. 属性
  3. 事件
  4. 索引

抽象成员的其他注意事项

  • 尽管抽象成员必须在派生类中用相应的,但不能把virtual修饰符附加到abstract修饰符
  • 类似虚成员,派生类中抽象成员的实现必须指定override修饰符

抽象类

抽象类是指设计为被继承的类,抽象类只能被用作其他类的基类

  • 不能创建抽象类的实例
  • 抽象类使用abstract修饰符声明
  • 抽象类可以包含抽象成员或普通的非抽象成员。
  • 抽象类可以自己派生自另一个抽象类
  • 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类
 abstract class AbClass //抽象类
{
public void A() //普通方法
{
Console.WriteLine("我是抽象类");
}
abstract public void B(); //抽象方法 } class MyDerivedClass : AbClass //派生类
{
public override void B()
{
Console.WriteLine("我是派生类");
} } static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
derived.A();
derived.B();
Console.ReadLine();
}

密封类

密封类只能被用作独立的类,它不能被用作基类

密封类使用sealed修饰符标注

静态类

静态类中所有的成员都是静态的。静态类用于存放不受实例数据影响的数据和函数。

  • 静态类必须标记为static
  • 类的所有成员必须是静态的
  • 类可以有一个静态构造函数,但不能有实例构造函数,不能创建类的实例
  • 静态类是隐试密封的,也就是说,不能继承静态类

扩展方法

扩展方法的重要要求如下

  • 声明扩展方法的类必须声明为static  
  • 扩展方法本身必须为static
  • 扩展方法必须包含关键字this作为他的第一个参数类型,并在后面跟着它所扩展的类的名称

[C#基础] 继承的更多相关文章

  1. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

  2. python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  3. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  4. 《Java基础——继承》

    Java基础--继承     一.类的继承: 规则: 1.一个子类只能有一个父类,但一个父类可以有多个子类,每个子类都可以作为父类使用. 2.若一个类没有声明父类,则默认其父类为Object. 3.父 ...

  5. OC基础--继承

    继承的基本概念: 现实生活中的继承: 人类是一个基类(也称做父类),通常情况下所有人类所共同具备的特性,如有手有脚能吃能喝 按照生活常规,我们继续给人类来细分的时候,我们可以分为学生类 工人类等,学生 ...

  6. Java基础--继承方法调用顺序

    最近因为面试的原因,回过头来复习基础的知识,都忘光了,准备买本面试书回来啃. 我先把自己测试的结论总结写出来,以后忘记再来看看 如果b类继承自a类,在main方法中new出b的对象(不带参数),那么他 ...

  7. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  8. python基础===继承

    编写类时,并非总是要从空白开始.如果你要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所 ...

  9. 03Java基础——继承

    1.继承 例如一个员工类,包括开发员工和经理. package cn.jxufe.java.chapter2.demo12; public class Employee { String name; ...

  10. Java 基础 - 继承

    子类继承父类的private字段么? Oracle的Java Documentation对Inheritance的定义: 很直白,定义里面就告诉你了这不叫继承.继承的意思是你可以对其进行直接的调用和修 ...

随机推荐

  1. Ubuntu: 搭建tftp,nfs服务器

    Ubuntu12.04搭建tftp&nfs服务器 http://blog.163.com/thinki_cao/blog/static/83944875201411610467306/ 硬件环 ...

  2. BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )

    云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...

  3. 1688: [Usaco2005 Open]Disease Manangement 疾病管理( 枚举 )

    我一开始写了个状压dp..然后没有滚动就MLE了... 其实这道题直接暴力就行了... 2^15枚举每个状态, 然后检查每头牛是否能被选中, 这样是O( 2^15*1000 ), 也是和dp一样的时间 ...

  4. Eclipse使用技巧总结(三)

    十六.快速关闭窗口   关闭当前打开窗口 Ctrl + W       关闭当前打开的所有窗口 Ctrl +Shift +F4 十九.重命名  F2 二十.快速回到上次编辑点  Ctrl + Q 二十 ...

  5. iOS图片拉伸技巧-李明杰分享

    http://bbs.itcast.cn/thread-21436-1-1.html 本文目录 "一.iOS5.0之前------------------------------------ ...

  6. 【转】android加载大量图片内存溢出的三种解决办法

    方法一: 在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @param scalSize 缩小的倍数 * @return ...

  7. vim: 搭建vim看代码的环境

    使用 vim + ctags + cscope + taglist 阅读源码  http://my.oschina.net/u/554995/blog/59927 vim tab变空格 http:// ...

  8. Microsoft Win32 Programmer's Reference.chm

    实在是太棒了,感谢这位网友: http://download.csdn.net/detail/tgyd6800/9632351

  9. VDI转vmdk(VirtualBox与VMware硬盘格式转换)[转]

    VirtualBox用了一段时间,感觉没想像中那么的好.虽然设置里可以分配多CPU,但是分配多CPU后经常系统挂掉.整体感觉不够稳定,但它也有好处就是开源免费.但经常挂机总不能一直使用它,索性转到Vm ...

  10. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法

    var xmlHttp; //定义变量,用来创建xmlHttp对象 function ajaxfunction(url,onreadystatechangMethod,param){ // 创建xml ...