VS派生类

  • 继承。派生类
class AClass : FClass
构建函数继承 public classname (string astring): base(astring){};默认不继承基类的构建函数。基类的在前面执行,然后执行派生类构建函数中的代码。
  • 多态性
即看对象变量引用的是哪个类的实例,优先用对应类的方法,如果没有,到基类找。
一说同名操作,有多种,包含重载、重写、隐藏方法等
重写即派生类重写基类方法
基类定义允许重写
public virtual viod methodname(){}
派生类重写
public override viod methodname(){}
方法名必须相同;参数列表必须相同;相同的返回值;存取权限相同
  • 隐藏基类成员
用于版本,用new定义
隐藏域
    基类 public string astring;
    派生类public new string astring;
隐藏方法
参数必须相同。
    基类public classname(string:astring);
    派生类public new classsname(string:astring);
 
(1)隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。
(2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。
 (3)和上一条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果引用的是父类的实例那么调用基类的方法,如果引用的是派生类的实例则调用派生类的方法。
  • 区别隐藏和重写
“重写”:允许使用现有成员的一个新实现代替基础类实现。换句话说就是允许使用自己的实现代替相
                        同名称的一个基类成员。
“隐藏”:可以模糊一个基类的成员并用一个完全不同的新实现代替它。
“重写”:在基类中要被重写的方法要修饰为virtual,在子类中该方法要被修饰为overrride。
                  新实现的方法必须与要被重写的方法有相同的函数名,函数签名,返回类型以及
                  访问级别。(简单来说就是除了virtual/override,其他函数声明完全一致)
“隐藏”:子类中的方法要被修饰为new
                  子类中的方法与要被隐藏的方法有相同的函数签名并且是相同种类的成
                  员,但是它可以拥有不同的访问级别,返回类型以及函数实现 。
 “重载”:一个重载的方法必须拥有于先前存在的方法有相同函数名字,而且必须拥有不同
                  的函数签名,至于返回类型和访问级别可以相同也可以不同
任何拥有于先前存在的方法相同的函数名,不同色调签名方法,都将被看做是那个方法的一个重载并且不会隐藏先前存在的方法        
如果一个继承类被强制转换为的他的一个基类并且一个重写的方法被调用:
       if 新的方法是重写的,则对象的类型决定那个方法被调用,而不是变量。
                 这种情况下继承类的方法被调用
       if 新的方法是隐藏的,则变量的类型决定那个方法被调用,而不是对象。
                  这种情况下基类的方法被调用
  • 抽象方法
在基类中定义的并且必须在派生类中重写的方法,
在基类使用abstract关键字定义
在派生类使用overide关键字定义
 
  • 版本
定义了基类虚方法后,子类定义同名方法,但没写new或override,会出现编译错误,所以子类要定义关键字。
  • System.Object类
所有类都隐含从这个类派生。
比较有用的方法有。ToString(),返回一个与对象的类名相等的字符串,mycar.ToString()等于类名Car;静态方法Equals(object,object),Car.Equals(mycar,myothercar),对比两个对象是否相等;静态方法ReferenceEquals(object,object),对比两个对象引用是否引用同一个对象,Car.ReferenceEquals(mycar,myothercar);GetType()返回对象的类,或返回变量的类型,mycar.gettype()返回类名;Finalize(),允许对象在垃圾收集器从内存删除对象之前进行清除工作;MemberwiseClone,创建对象的拷贝,mycar.MemberwiseClone返回拷贝对象。
比如,可在类中重写虚方法ToString,实现返回一个域值
  • 重载System.Object类方法
因为都是从System.Object类继承,所以可重载System.Object类的虚方法virtual
  • 包装和解包
包装:把变量隐式包装成一个system.object对象,简写成object
解包:把变量包装的object对象,解包成变量。
int myint =10;
可显示写成
int myint =10;
object myobject = myint;这里是包装
int myint2 = (int)myobject;这里是解包
因为有隐含的包装和解包,可以像使用对象一样使用变量,如myint.tostring(),如myint.gettype()。
  • 抽象类和抽象方法
抽象类用abstract,代表概念,可派生出代表实际的类
抽象方法也是abstract,在派生类中,这个方法必须被重写,并必须包含代码。
特点,不能创建抽象类的对象;不能标记构建函数为抽象的;可以用抽象类派生另一个类(包括抽象类);必须在派生类用代码重写基类的抽象方法。
  • 密封类和方法sealed
密封类和密封方法限制继承和多态。即不能继承密封类,不能重载重写密封方法。在public等前加sealed
  • 强制转换对象
基类和派生类之间可互相转换,可跨级转换,只要其中一个类是另一个类的基类或更上级基类。
转换后的效果是,只能存取转换后的类的成员了。
向上转换,转换成基类fatherclass myfatherclass = (fatherclass) mychildclass;
向下转换,转换成派生类 childclass mychildclass = (childclass )myfatherclass;
  • 存取访问限制
  • 重载运算符
重写算术运算、比较值等。
比如==,当比较对象时,其实比较的是对象变量的引用,如果想比较对象的实例域,就不能用默认的静态的==了,可以用重写默认的静态的==,如果重写了==和Equals,就必须重写!=,即重写了一个运算符,就必须重写与其相对的运算符,如==和!=,<和>。
public static bool operator == (class1 myclass1,class2 myotherclass1){}
比如+,当比较对象时,会编译报错,因不能简单的加两个对象,可以重写+,实现加对象的实例域的值。
public static class1 opertator +(class1 myclass1,class2 myotherclass1){}
 
 

C#-派生类的更多相关文章

  1. .NET面试题系列[11] - IEnumerable<T>的派生类

    “你每次都选择合适的数据结构了吗?” - Jeffery Zhao .NET面试题系列目录 ICollection<T>继承IEnumerable<T>.在其基础上,增加了Ad ...

  2. .NET面试题系列[10] - IEnumerable的派生类

    .NET面试题系列目录 IEnumerable分为两个版本:泛型的和非泛型的.IEnumerable只有一个方法GetEnumerator.如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...

  4. C++中虚继承派生类构造函数的正确写法

    最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...

  5. c# 中基类变量指向派生类对象的实例化

    这一篇文章转载自:http://www.xuebuyuan.com/390279.html 我对这篇文章进行了一一的验证,确实是这样子的,也明白了很多东西,觉得很有用,转载过来希望能够帮助大家. 1. ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. 【转载】C++中的基类与派生类

    转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...

  8. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  9. (转) C++中基类和派生类之间的同名函数的重载问题

    下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...

  10. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

随机推荐

  1. Linux逻辑卷的拉伸和缩小

    相对于普通磁盘优势是逻辑卷可以在线动态的拉伸(不用先unmount操作),只要vg中有足够的空间即可 1:首先查看vg是否有足够的空间 [root@gechong mapper]# vgdisplay ...

  2. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  3. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层

    视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...

  4. session第二篇

    二 A.application对象 1.application对象实现了用户间数据的共享,可存放全局变量. 2.application对象开始于服务器的启动,终止于服务器的关闭. 3.在用户的前后连接 ...

  5. SpringMVC的实现过程

    Spring Web MVC 处理Http请求的大致过程: 一旦Http请求到来,DispatcherSevlet将负责将请求分发.DispatcherServlet可以认为是Spring提供的前端控 ...

  6. Linux 查看当前时间

    一.查看和修改Linux的时区1. 查看当前时区命令 : "date -R"2. 修改设置Linux服务器时区方法 A命令 : "tzselect"方法 B 仅 ...

  7. 5.Longest Palindromic Substring (String; DP, KMP)

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  8. iOS下JS与OC互相调用(七)--Cordova 环境搭建

    Cordova大家可能比较陌生,但肯定听过 PhoneGap ,Cordova 就是 PhoneGap 被 Adobe 收购后所改的名字.它是一个可以让 JS 与原生代码互相通信的一个库,并且提供了一 ...

  9. 【校招面试 之 C/C++】第2题 函数模板、类模板、特化、偏特化

    1.C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样 ...

  10. python之面向对象之继承

    #写一个类SchoolMember class SchoolMember(object): member_num = 0 def __init__(self,name,age,sex): self.n ...