飘过来学C#系列(2)之------继承

2.1 实现继承和接口继承

实现继承:一个类型派生于一个基类型,它用于基类型的所有成员字段和函数.

 class BaseClass
    {
        public string UserName = "C#";
        public static string GetUserName()
        {
            return "";
        }
    }
    class ImpleteClass:BaseClass
    {
        public string PrintName()
        {
            return GetUserName();
            //return UserName
        }

    }

 ImpleteClass类继承BaseClass,就可以用基类中所有的成员字段如UserName,GetUserName();

接口继承 表示一个类型只继承了函数的签名,没有继承任何实现代码.在需要制定该类型具有某些可用的特性时,最好

使用这种类型的继承.

2.2 多重继承

C#不支持多重实现继承.但C#允许类型派生自多个接口---多重接口继承.这说明

C#类可以派生自另一个类和任意多个接口.

2.3 Virtual关键字

virtual 关键字用于在基类中修饰方法。virtual的使用会有几种情况:

1, 如果方法不是virtual的,编译器就使用声明的类对应的类型,也就是说,不是virtual的,在编译时候,就定了。比如下面的例子:子类的方法都没有执行,执行的全部都是父类的方法。运行的结果是
father
boy
girl

public class ClassFather
    {
        public string s1;
        public void VirFun()
        {
            Console.WriteLine(s1);
        }

    }
    public class ClassBoy : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
        }

    }
    public class ClassGirl : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
            Console.WriteLine(s1);
        }
    }

    public class Test
    {
        public static void Main()
        {
            ClassFather a = new ClassFather();
            a.s1 = "father";
            a.VirFun();
            ClassFather b = new ClassBoy();
            b.s1 = "boy";
            b.VirFun();
            ClassFather c = new ClassGirl();
            c.s1 = "girl";
            c.VirFun();
            Console.ReadKey();
        }

    }

 2, 如果方法是Virtual的,然后子类使用了override, 编译器就生产代码。然后,在运行的时候,进行检测,看对象属于哪个类,然后调用这个类的方法。运行的结果是
father
boy
girl

girl

 public class ClassFather
    {
        public string s1;
        public virtual void VirFun()
        {
            Console.WriteLine(s1);
        }

    }
    public class ClassBoy : ClassFather
    {
        public override void VirFun()
        {
            base.VirFun();
        }

    }
    public class ClassGirl : ClassFather
    {
        public override void VirFun()
        {
            base.VirFun();
            Console.WriteLine(s1);
        }
    }

    public class Test
    {
        public static void Main()
        {
            ClassFather a = new ClassFather();
            a.s1 = "father";
            a.VirFun();
            ClassFather b = new ClassBoy();
            b.s1 = "boy";
            b.VirFun();
            ClassFather c = new ClassGirl();
            c.s1 = "girl";
            c.VirFun();
            Console.ReadKey();
        }

    }

 3,如果一个父类的方法是virtual,子类不是用override,而是用new来覆盖了,那么运行子类的时候,还是执行声明的类的方法。比如下面的例子中,girl类对象就是。

father
boy
girl

public class ClassFather
    {
        public string s1;
        public virtual void VirFun()
        {
            Console.WriteLine(s1);
        }
    }
    public class ClassBoy : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
        }
    }
    public class ClassGirl : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
            Console.WriteLine(s1);
        }
    }

    public class Test
    {
        public static void Main()
        {
            ClassFather a = new ClassFather();
            a.s1 = "father";
            a.VirFun();
            ClassFather b = new ClassBoy();
            b.s1 = "boy";
            b.VirFun();
            ClassFather c = new ClassGirl();
            c.s1 = "girl";
            c.VirFun();
            Console.ReadKey();
        }

    }

  

 

时间: 2024-10-13 14:48:45

飘过来学C#系列(2)之------继承的相关文章

飘过来学C#系列(1)之------对象和类型

1.1 类和结构 类是存储在堆上的引用类型,而结构是存储在栈上的值类型. 类使用的关键词是class,而结构使用的是struct生声明. 1.2 数据成员 数据成员是包含类的数据-----字段,常量和事件的成员.数据成员可以是静态数据.类成员总是实例成员,除非用static进行显式声明. 常量与类的关联方式同变量与类的关联方式.使用const关键字来声明常量. 如果声明为public就可以在类的外部访问它 事件是类的成员,在发生某些行为(如改变类的字段或属性,或者进行了某种形式的用户交互操作)时

飘过来学C#系列(3)之------泛型

泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型.泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念. 泛型的优点: 性能 值类型存储在栈上,引用类型存储在堆上,.net中很容易把值类型转换为引用类型,将一个值类型转换为引用类型叫装箱,反之叫拆箱,装箱和拆箱操作很容易进行,但是会损失性能. var l

D&F学数据结构系列——红黑树

红黑树 定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个结点不是红的就是黑的 2)根结点是黑的 3)每个叶结点是黑的 4)如果一个结点是红的,它的两个儿子都是黑的(即不可能有两个连续的红色结点) 5)对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点 性质: 这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长.结果是这个树大致上是平衡的.因为操作比如插入.删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上

D&F学数据结构系列——B树(B-树和B+树)介绍

B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x]<=...<=keyn[x][x], c)leaf[x],是一个布尔值,如果x是叶子的话,则它为TRUE,如果x为一个内节点,则为FALSE. 2)每个内节点包含n[x]+1个指向其子女的指针c1[x],c2[x],...,cn[x]+1[x].叶节点没有子女,故它们的ci域无意义. 3)各关键

跟老杨学java系列(五) JDK的安装与配置

跟老杨学java系列(五) JDK的安装与配置 提示:本节内容对于java入门是非常关键的,对于刚接触java的同学一定要认真学习,欢迎大家留言探讨技术问题.其他问题概不回复. (书接上回)上节课程我们简单介绍了java项目的开发过程及常用的开发工具,这节课我们详细讲解一下JDK的安装与配置.根据上一节的学习,我们知道编写完java代码后,需要先对java代码进行编译,然后再执行.而java程序的编译与执行都是通过JDK来完成的.所以做java开发,首先我们需要学会安装和配置JDK.下面我们就来

D&amp;F学数据结构系列——二叉堆

二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在[i/2](向下取整)中. 因此,一个数据结构将由一个数组.一个代表最大值的整数.以及当前的堆的大小组成.一个典型的优先队列(priority queue)如下: 1 #ifndef _BinHeap_H 2 struct HeapStruct; 3 type

跟老杨学java系列(二) PNP训练法介绍

跟老杨学java系列(二) PNP训练法介绍 声明:以下内容可能会有做广告的嫌疑,哈哈~~.大家不想看的忽略就好..欢迎大家留言探讨技术问题.其他问题概不回复. (书接上回)PNP训练法是国内java培训机构-乐橙谷推出的一种针对java培训的学习训练方法.该训练法摒弃了传统的以章节知识点为线索的教学方式,改为以完整的项目开发过程为线索.以对功能点的分析设计驱动出的知识点为授课内容.以迭代为教学手段,学习难度由浅入深,让学生在充分了解软件开发过程的基础上,熟练掌握项目开发经验.深入掌握相关开发技

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

面向对象系列一(继承)

面向对象的三大特性--继承.封装.多态性. 我们先来说说继承.继承,是子类对父类的沿用,父类的除私有(private)部分外,都可以归子类所继承. 继承的关系:子类=继承类=派生类,父类=基类 对父类进行继承的子类被称为继承类.又可描述为父类派生而产生的子类为派生类. 被子类继承的父类被称为基类 继承的两个特性:单一性.传递性. 单一性:说的是单继承,即子类直接继承只能继承于一个父类. 传递性:继承可以传递,即继承类又可以成为其他类的基类. 继承的作用:实现代码(功能的)可重用.可扩充. 继承的