C#基础概念之接口的多继承会带来哪些问题?
C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性(这也正是 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(); }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
C#基础概念之抽象类和接口的区别?
抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义,抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性,分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”,为外部提供调用或功能需要扩充时优先使用接口
C#基础概念之别名指示符是什么?
通过别名指示符我们可以为某个类型起一个别名,主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间,别名指示符只在一个单元文件内起作用
示例:
复制
using System; using System.Collections.Generic; using System.Text; namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01 { class Class1 { public override string ToString(){ return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1"; } Class2.cs using System; using System.Collections.Generic; using System.Text; namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02 { class Class1 { public override string ToString(){ return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1"; }主单元(Program.cs): using System; using System.Collections.Generic; using System.Text; //使用别名指示符解决同名类型的冲突 using Lib01Class1 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01.Class1; using Lib02Class2 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02.Class1; namespace Example19 { class Program { static void Main(string[] args){ Lib01Class1 tmpObj1 = new Lib01Class1(); Lib02Class2 tmpObj2 = new Lib02Class2(); Console.WriteLine(tmpObj1); Console.WriteLine(tmpObj2); Console.ReadLine(); }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
【编辑推荐】