.NET基础 (06)面向对象的实现

面向对象的实现
1 C#中类可以有多个父类、可以实现多个接口吗
2 简述C#中重写、重载和隐藏的概念
3 为什么在构造方法中调用虚方法会导致问题
4 在C#中如何声明一个类不能被继承

面向对象的实现

1 C#中类可以有多个父类、可以实现多个接口吗

C#中最多只能有一个父类,但可以实现多个接口。

2 简述C#中重写、重载和隐藏的概念

重写是指用Override关键字重新实现基类中的虚方法,在运行的过程中,无论通过那个类型的引用,真正类型的方法将被调用。

隐藏是指用new关键字重新实现基类中的方法,在运行的过程中通过引用的类型判断应该调用哪个类型的方法。

重载是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。

3 为什么在构造方法中调用虚方法会导致问题

构造方法中调用虚方法将导致运行时的错误。这是因为构造方法被调用时,子类的构造方法还未被调用,但是根据实际对象的类型,基类调用的虚方法是定义在子类中的方法,这就意味着调用了一个未完成构造的类型对象的方法,不可预计的错误将可能发生。

构造方法示例如下:

    class Constructor
    {
        static void Main(string[] args)
        {
            //构造了一个底层类型
            C c = new C();
            Console.Read();
        }
    }
    public class Ref
    {
        public Ref(string s)
        {
            Console.WriteLine(s);
        }
    }
    public class Base
    {
        public Ref basestring = new Ref("Base初始化表达式");
        public Base()
        {
            Console.WriteLine("Base构造方法");
        }
    }
    public class A:Base
    {
        public Ref astring = new Ref("A初始化表达式");
        public A():base()
        {
            Console.WriteLine("A构造方法");
        }
    }
    public class B : A
    {
        public Ref bstring = new Ref("B初始化表达式");
        public B(): base()
        {
            Console.WriteLine("B构造方法");
        }
    }
    public class C : B
    {
        public Ref cstring = new Ref("C初始化表达式");
        public C(): base()
        {
            Console.WriteLine("C构造方法");
        }
    }

输出结果:

C初始化表达式
B初始化表达式
A初始化表达式
Base初始化表达式
Base构造方法
A构造方法
B构造方法
C构造方法

4 在C#中如何声明一个类不能被继承

C#通过关键字sealed可以申明一个类型不可被继承,设计中应该为所有不被作为基类的类型添加sealed关键字,以避免各种来自继承的易产生的错误。

String类就是sealed的

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

时间: 2024-12-21 02:14:35

.NET基础 (06)面向对象的实现的相关文章

Java基础06 组合(转载)

在一个新类的定义中使用其他对象.这就是组合(composition).组合是在Java中实现程序复用(reusibility)的基本手段之一. 组合与"has-a" 一个对象是另一个对象的数据成员.比如我们看之前提到的充电电筒的例子: 一个充电电筒中的电池.LED灯.按钮…… 都可以是一个对象.我们可以定义一个Battery类来定义和产生电池对象.而在充电电筒的类定义中,可以用一个电池对象作为其数据成员,来代表电池部分的状态. 我们下面定义一个Battery类,并用power来表示其电

【C++基础 06】explict关键字

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 1.示例 我们先来看一段示例代码: class A { public: A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var == ref.var;}//判等函数 private: int var;//成员变量var }; void main()

Java基础和面向对象

Java基础和面向对象 一.数据类型和运算符 标识符 组成:字母.数字.下划线.$ 首字母:不能是数字 见名知义 不能是关键字(48个) 正确的:name.name123.age._name.$name 错误的:1name.public.123.na%me 标识符主要给一个元素起名字,需要符合起名字的以上4种规则.比如说,类的名字:首字母大写:变量名称:小写:方法名称:驼峰命名:数组名称.接口名称.集合名称. //你定义为汉字也可以,不过不推荐,因为国际语言以English为主.为了面向世界,使

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

Python基础09 面向对象的进一步拓展

Python基础09 面向对象的进一步拓展 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数.这个参数表示某个对象.对象拥有类的所有性质,那么我们可以通过self,调用类属性. class Human(object): laugh = 'hahahaha' def show_laugh(

Python基础06 循环

Python基础06 循环 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系.循环也会用到类似的写法. for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次. 基本构造是 for 元素 in 序列: statement 举例来说,我们编辑一个叫forDemo.py的文件 for a in [3,4.4,

[.net 面向对象编程基础] (11) 面向对象三大特性——封装

[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承.多态. 1.封装概念 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. 2.封装的优点 A.良好的封装能够减少耦合(比如实现界面和逻辑分离) B.可以让类对外接口不变,内部可以实现自由的修改 C.类具有清晰的对外接口,使用者只需调用,无需关心

J2SE基础:4.面向对象的特性

面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的访问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其它类去实现. 将内部的实现隐藏化.别人不用去关心内部怎么实现. 只要调用方法就可以得想结果. 继承: 继承的特性: A:通过继承可以实现代码的复用.子类可以继承父类中的变量及方法. 前提:父类访问修饰符的控制对继承的影响: 父类私有的属性与方法不能被子类继承. Default:同一包中可以访问. B

J2SE基础:5.面向对象的特性3

1:抽象方法: 当父类的某个方法都会被子类重写时,那么父类的方法就没有 实现的必要.但必须要声明. 所以这个方法就可以定义抽象方法(只有声明,没有实现). 2:抽象类: 由于抽象方法是不完整的方法,因而抽象方法所属的类也是一个不 完整的类,所以类必须定义成抽象类. 抽象类中可以包含抽象方法和非抽象方法. 3:当一个子类继承抽象类时 子类就必须重写抽象类中的所有的抽象方法. 如果子类不想实现,那么必须将自已也定义一个抽象类. 4:抽象类不能被实例化,只能实例化子类. Animal animal =

Android基础-06

Android基础-06 Activity页面跳转和数据传递 01_AndroidManifest文件中的几个细节 在Android应用程序中一个activity就对应了一个界面. 结论: 1.一个应用程序可以有多个桌面图标: 2.创建快捷图标的方法: <intent-filter> //main 应用程序的入口 <action android:name="android.intent.action.MAIN" /> //LAUNCHER 启动器 <cat