积极答复者
抽象类与接口的区别?为什么这样设计呢?

问题
-
public abstract class Persion { public abstract void Eat(); } interface Human { void Walk(); } public class Chinese:Person,Human { public override void Eat() { Console.WriteLine("Chiese is Eatting"); } public void Walk() { Console.WriteLine("Chiese is Walking"); } private void Human.Walk() { Console.WriteLine("Human can Walk"); } public static void Main(string[] args) { Human h=new Chinese(); h.Walk(); //输出Human can Walk } }
以上代码是正确的,但是有两个不太明白的地方:
1)为什么抽象类Person必须定义成public,而Human接口却可以不用定义成public?
2) Chinese类中private void Human.Walk(),明显是private,为什么在外部仍然可以使用?yanglei
- 已编辑 Lane3000 2012年5月30日 12:34
- 已移动 ThankfulHeartModerator 2012年5月31日 2:10 语言特定,.NET一般问题 (发件人:Visual C#)
答案
-
楼主好:)
这个问题问得有意思——的确诚然如您所说,这个方法是private的,但是为什么通过public可以调用呢?这是“显式接口”与众不同的地方——
一般地,如果实现一个接口都是隐式的(这样通过接口引用和类实体都可以直接引用此方法进行调用)。
不过如果有时不同NameSpace下产生相同名字的接口,怎么办?微软“别出心裁”想出了“显式接口”定义(就是你这样子)。
显式接口:
1)必须是private(这就意味着通过类实体自身无法直接调用该方法)。如您的代码,这样做反而错误:
Chinese h = new Chinese(); h.Walk(); //输出Human can Walk
2)只能通过Human接口调用。
- 已建议为答案 Mike FengModerator 2012年6月1日 7:03
- 已标记为答案 Lane3000 2012年6月5日 9:24
全部回复
-
第一个问题:
这是语法所决定的——因为抽象类本质还是一个类,只不过这个类不能被实例化(没有公共构造函数),而且一般包含一个abstract的抽象方法用于子类实现多态效果。既然是一个类,那么类的方法可以是public,也可以是其它的类型(不是必须,除了private外,因为private无法被子类重写!)
但是接口的目的只是一种规范而已,如果一个类实现了某个接口,那么说明这个类拥有这个方法(提供这个方法而已),因为要约束为公共所用,所以方法默认就是public的。
第二个问题,我不清楚为什么你可以把实现接口的public方法改成private也可以用,照例是不可以的!
看我编译就出错了——
- 已编辑 ThankfulHeartModerator 2012年5月31日 2:25
- 已建议为答案 Mike FengModerator 2012年6月1日 7:03
-
感谢回复,第一个问题问题有点点理解。
但是第二个问题:我修改下,再说明
interface Human { void Walk(); } public class Chinese : Person, Human { public override void Eat() { Console.WriteLine("Chiese is Eatting"); } public void Walk() { Console.WriteLine("Chiese is Walking"); } void Human.Walk() //这里默认是private { Console.WriteLine("Human can Walk"); } }
class Program { static void Main(string[] args) { Human h = new Chinese();//这里Human和Chinese都是前一个Assembly的 h.Walk(); //输出Human can Walk } }
按照道理,
void Human.Walk() // 默认是private,应该是不可以在另外的Class中访问的?
yanglei
-
楼主好:)
这个问题问得有意思——的确诚然如您所说,这个方法是private的,但是为什么通过public可以调用呢?这是“显式接口”与众不同的地方——
一般地,如果实现一个接口都是隐式的(这样通过接口引用和类实体都可以直接引用此方法进行调用)。
不过如果有时不同NameSpace下产生相同名字的接口,怎么办?微软“别出心裁”想出了“显式接口”定义(就是你这样子)。
显式接口:
1)必须是private(这就意味着通过类实体自身无法直接调用该方法)。如您的代码,这样做反而错误:
Chinese h = new Chinese(); h.Walk(); //输出Human can Walk
2)只能通过Human接口调用。
- 已建议为答案 Mike FengModerator 2012年6月1日 7:03
- 已标记为答案 Lane3000 2012年6月5日 9:24