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 swappiness 提高物理内存使用率

    swappiness的值的大小对如何使用swap分区是有着很大的联系的. swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使 ...

  2. 初涉定制linux系统之——rpm相关安装包的准备

    在上一篇博客http://www.cnblogs.com/dengtr/p/5543820.html#3634582 中介绍了如何定制Centos系统镜像,但其中有个问题,就是服务所依赖的安装包不在原 ...

  3. StringBuild的一个小问题

    今天在项目开发的过程中写了一小段代码: sb_result.AppendFormat("{\"SmsmTaskModeName\":\"{0}\",\ ...

  4. idea 安装uml 画图工具

    centos7上: yum -y install graphviz mac上: brew install Graphviz file -> setting->plugins 安装plant ...

  5. Subquery typo with using in(转)

    Subquery typo with using in Do you use the following syntax?   SELECT * FROM TABLE WHERE COLUMN IN ( ...

  6. 基于Woodstox的StAX 2 (Streaming API for XML)解析XML

    StAX (Streaming API for XML)面向流的拉式解析XML,速度快.占用资源少,非常合适处理大数据量的xml文件. 详细教程和说明可以参见以下几篇文章: 使用 StAX 解析 XM ...

  7. 第八章 高级搜索树 (xa2)红黑树:结构

  8. keras—多层感知器MLP—MNIST手写数字识别

    一.手写数字识别 现在就来说说如何使用神经网络实现手写数字识别. 在这里我使用mind manager工具绘制了要实现手写数字识别需要的模块以及模块的功能:  其中隐含层节点数量(即神经细胞数量)计算 ...

  9. Majority Element(ARRAY-BINARY SEARCH)

    QUESTION Given an array of size n, find the majority element. The majority element is the element th ...

  10. 21-js 实现评论时间格式转化

    js里面要用可以用伊尔表达式,循环是用js: document.getElementById("${pj.pltime }").innerHTML = dateToGMT(&quo ...