C# 面向对象编程的继承性-多继承
多继承
如果要使用多继承,需要使用接口,因为C#中的类只支持单继承,而接口支持多继承,实现多继承时,继承的多个接口中间用逗号(,)隔开。
说明:
实现多继承时,继承的可以是多个接口,也可以是一个类及多个接口。
下面通过一个实例讲解如何实现多继承。
例创建一个控制台应用程序,首先定义两个接口,分别表示人的实体接口和行为接口;然后声明一个类,并使这个类继承于定义的两个接口,在该类中实现接口中的成员属性和方法;最后在Main方法中实例化派生类的对象,并使用该派生类对象调用人的实体接口和行为接口中的属性和方法。代码如下:
interface IPeopleEntity //定义一个实体接口
{
string Name //定义名字属性
{
get;
set;
}
}
interface IPeopleActive //定义一个行为接口
{
void say(string str); //定义说话方法
}
class PeopleClass:IPeopleEntity,IPeopleActive //继承定义的两个接口
{
string name = ""; //定义名字变量
public string Name //实现接口中定义的名字属性
{
get
{
return name;
}
set
{
name = value;
}
}
bool CheckChinese(string str) //定义一个方法,用来判断字符串是不是中文
{
bool flag = false; //定义一个bool类型变量,作为标识
UnicodeEncoding encode = new UnicodeEncoding(); //实例化编码对象
byte[] b = encode.GetBytes(str); //将字符串转换为字节数组
for (int i = 0; i < b.Length; i++) //遍历字节数组
{
if (b[i] != 0) //判断字节数组中指定索引处的值是不是0
{
flag = true; //设置标识为true
}
else
{
flag = false; //设置标识为false
}
}
return flag; //返回定义的标识
}
public void say(string str) //实现接口中定义的说话方法
{
if (CheckChinese(str)) //判断输入的是不是中文
{
Console.WriteLine(str+"是中国人,请说汉语!");
}
else
{
Console.WriteLine(str + " is a american,please speak english!");
}
}
}
class Program
{
static void Main(string[] args)
{
PeopleClass peopleclass = new PeopleClass(); //实例化类对象
while (true)
{
Console.Write("请输入名字:");
peopleclass.Name = Console.ReadLine(); //记录用户输入的名字
peopleclass.say(peopleclass.Name); //根据用户输入显示相应的字符串
}
}
}
继承的原则
上面详细讲解了如何实现继承,包括单继承和多继承,这里主要总结一下C#中实现继承的几个主要原则,分别如下:
q除了object类,每个类有且只有一个直接基类,如果没有显式指定类的直接基类,那么它的直接基类就隐含的设置为object。object类没有任何直接或间接基类,它是所有类的终极基类;
q无论基类成员的可访问性如何,除构造函数和析构函数外,所有其他基类的成员都能被子类继承,然而,有些继承成员在子类中可能是不可访问的,比如,基类的private成员在子类中不可访问,但是,如果将子类的对象作为参数传入基类的方法内,那么在基类的代码内部,就可以通过子类或者子类的对象来访问基类的private成员;
q子类可以扩展它的直接基类;
q继承是可以传递的,比如C类从B类继承,而B类从A类继承,那么C类就会既继承B类中的成员,又继承A类中的成员;
q类不能循环继承,比如A类继承于B类,而B类继承于C类,那么C类就不能再去继承A类,因为它们之间存在了一种循环关系;
q类的直接基类必须至少与类本身具有同样的可访问性,比如,如果从private类派生一个public类,将会导致编译时错误;
q在子类中可以声明具有相同名称或签名的新成员来隐藏从基类继承而来的成员,但是,隐藏继承而来的成员时并不移除该成员,而只是使被隐藏的成员在子类中不可以直接访问;
q类中可以声明虚方法等,而子类可以重写这些虚方法的实现;
qC#中只支持类的单一继承,但是支持接口的多重继承;
q类的实例包含在该类中及它的所有基类中声明的所有实例字段的集合,并且存在一个从子类到它的任何基类的隐式转换,因此,可以将子类的实例看成是其任何基类的实例的引用。
.net笔试题
答:C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性,这时在实现时最好使用显式的声明
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example17
{
class program
{
//一个完整的接口声明示例
interface IExample
{
//属性
string p
{
get;
set;
}
//方法
string F(int Value);
//事件
event EventHandler E;
//索引指示器
string this[int Index]
{
get;
set;
}
}
interface IA
{
int Count { get; set;}
}
interface IB
{
int Count();
}
//IC接口从IA和IB多重继承
interface IC : IA, IB
{
}
class C : IC
{
private int count = 100;
//显式声明实现IA接口中的Count属性
int IA.Count
{
get { return 100; }
set { count = value; }
}
//显式声明实现IB接口中的Count方法
int IB.Count()
{
return count * count;
}
}
static void Main(string[] args)
{
C tmpObj = new C();
//调用时也要显式转换
Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);
Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
Console.ReadLine();
}
}
}
结果:
Count property: 100
Count function: 10000
C# 面向对象编程的继承性-多继承的更多相关文章
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...
- 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承
前面已经说到面向对象编程有封装,继承,多态三大特性,那么其中的继承则很重要,可以直接单独的拿出来解析 继承 1.什么是继承: 字面意是子女继承父母的家产或者特性等.而在编程里继承是指子类继承父类(基类 ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- 第2课第3节_Java面向对象编程_继承性_P【学习笔记】
摘要:韦东山android视频学习笔记 面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...
- java面向对象编程— —第七章 继承
7.1继承的起源 继承(Inheritance),即在面向对象编程中,可以通过扩展(extends)一个已有的类,并继承该类的属性的行为,来创建一个新的类. 已有的类称为父类(也可以称为基类,超类), ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件
面向对象编程(OOP)术语: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 ...
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
随机推荐
- Java OAuth开发包资料
原文地址:http://www.oschina.net/project/tag/307/oauth?lang=19&sort=time
- 使用bacula实现Linux的远程备份和还原
Bacula,被誉为开源软件中最好的备份还原软件,它提供了企业级的客户机/服务器的备份解决方案,能够通过网络来管理文件的备份,恢复和核实工作.Bacula,既有windows版本的,也有Linux,U ...
- Linux数据备份
今天需要用到备份网站,写了个脚本,备份了mysql和redis数据. #!/bin/bash BACKDIR="/home/tan/getll_backup" if [ ! -d ...
- Camus导入中文乱码问题(源码修改、编译、部署、任务启动)
Camus使用过程中业务方反映从Kafka导入至HDFS中的数据有中文乱码问题,且业务方确认写入的数据编码为UTF-8,开始跟进. 问题重现: (1)编写代码将带有中文的字符串以编码UTF-8 ...
- Linux学习笔记24——进程管道
一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入. 二 popen和pclose函数 #include <stdio.h> FILE *popen(const char ...
- cocos2d的安装
安装cocos2d其实就是在Xcode中安装几个模板,然后在Xcode里面就可以直接使用这些模板了. 其实说是模板,也就是封装了许许多多引擎的文件,相对于原生的程序,也许使用引擎模板更加方便. 下 ...
- 高清摄像头MIPI接口与ARM处理器的连接
MIPI摄像头常见于手机.平板中,支持500万像素以上高清分辨率.它的全称为“Mobile Industry Processor Interface”,分为MIPI DSI 和MIPI CSI,分别对 ...
- Java Executor 框架学习总结
大多数并发都是通过任务执行的方式来实现的.一般有两种方式执行任务:串行和并行. class SingleThreadWebServer { public static void main(String ...
- DEDECMS5.7 首页和栏目页调用文章按权重排序
dedecms 5.7版本已增加按权重排序功能: [arclist]标签增加按权重排序,在后台管理DEDE里找到以下目录\include\taglib中的arclist.lib.php文件并打开 大约 ...
- 来看看Github上流行的编码规范
Popular Coding Convention on Github是一个有趣的网站,它根据Github的代码提交情况分析了几种语言流行的代码规范,目前支持对JavaScript,Java,Py ...