none
抽象类与接口的区别?为什么这样设计呢? RRS feed

  • 问题

  • 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#)
    2012年5月30日 12:31

答案

  • 楼主好:)

    这个问题问得有意思——的确诚然如您所说,这个方法是private的,但是为什么通过public可以调用呢?这是“显式接口”与众不同的地方——

    一般地,如果实现一个接口都是隐式的(这样通过接口引用和类实体都可以直接引用此方法进行调用)。

    不过如果有时不同NameSpace下产生相同名字的接口,怎么办?微软“别出心裁”想出了“显式接口”定义(就是你这样子)。

    显式接口:

    1)必须是private(这就意味着通过类实体自身无法直接调用该方法)。如您的代码,这样做反而错误:

    Chinese h = new Chinese();          
    h.Walk();  //输出Human can Walk

    2)只能通过Human接口调用。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月1日 1:30
    版主

全部回复

  • 第一个问题:

    这是语法所决定的——因为抽象类本质还是一个类,只不过这个类不能被实例化(没有公共构造函数),而且一般包含一个abstract的抽象方法用于子类实现多态效果。既然是一个类,那么类的方法可以是public,也可以是其它的类型(不是必须,除了private外,因为private无法被子类重写!)

    但是接口的目的只是一种规范而已,如果一个类实现了某个接口,那么说明这个类拥有这个方法(提供这个方法而已),因为要约束为公共所用,所以方法默认就是public的。

    第二个问题,我不清楚为什么你可以把实现接口的public方法改成private也可以用,照例是不可以的!

    看我编译就出错了——


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月31日 2:15
    版主
  • 感谢回复,第一个问题问题有点点理解。

    但是第二个问题:我修改下,再说明

      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

    2012年5月31日 12:03
  • 楼主好:)

    这个问题问得有意思——的确诚然如您所说,这个方法是private的,但是为什么通过public可以调用呢?这是“显式接口”与众不同的地方——

    一般地,如果实现一个接口都是隐式的(这样通过接口引用和类实体都可以直接引用此方法进行调用)。

    不过如果有时不同NameSpace下产生相同名字的接口,怎么办?微软“别出心裁”想出了“显式接口”定义(就是你这样子)。

    显式接口:

    1)必须是private(这就意味着通过类实体自身无法直接调用该方法)。如您的代码,这样做反而错误:

    Chinese h = new Chinese();          
    h.Walk();  //输出Human can Walk

    2)只能通过Human接口调用。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月1日 1:30
    版主