类和接口细节分析

来源:互联网 发布:山灵m2知乎 编辑:程序博客网 时间:2024/06/03 19:14
  1. 抽象类是否可继承接口?

抽象类里面可以包括抽象方法和非抽象方法,而接口只是定义了方法的原型,没有方法的具体定义。从这方面来分析,抽象类是可以继承接口的。

  1. 抽象类继承接口后,一定要实现接口中的成员方法么?

答案是否定的。

抽象类继承接口后,可以实现接口中的成员方法,也可以不实现。如果不实现接口中成员方法,只需将该方法声明为abstract类型就可以了。

interface ITemp

    {

        void IM();

    }

abstract class CTemp : ITemp

    {

        public abstract void IM();

    }

  1. (抽象)类继承类和接口的顺序是如何的?

    class A

    {

    }

    interface IA

    {

    }

    interface IB

    {

}

能否像下面一样定义一个类?

class B : IA, IB, A

    {

    }

答案是不可以。编译器会告诉你:基类A必须在任何接口之前。

所以应该写成:

class B : A, IA, IB

    {

    }

这是为什么呢?

下面是一家之言,仅供参考,不能保证所说的正确性。如果有误,敬请斧正。

针对上面的例子,假设类A中有一个方法时M,接口IA中同时声明了一个方法M。如果类B是按照IA, IB, A这样的顺序继承,则在B类型执行内存分配时,B对象的方法表里面首先加载接口IA中的方法的实现,之后是IB的,再之后是A的。因为A中也有方法M,所以这样的顺序是不是会认为M是IA中成员M的实现呢?如果类B是按照A, IA, IB这样的顺序继承,就不存在这样的情况了。

  1. 接口可以继承抽象类么?

接口只定义成员方法的原型,并不包括成员方法的实现。抽象类里面可能有实现的方法。如果说,接口可以继承抽象类,那这就和“接口只声明成员方法的原型,而没有具体方法的定义”相违背。

所以说,接口不能继承抽象类。

  1. 接口中可以包含属性和事件,但是不可以包含字段。

       属性和事件在编译的时候编译器会自动将其转化成方法。

  1. 接口中不能再声明类型。例如接口中不能再定义类,不能再声明接口等等,但是类里面可以再定义类,再声明接口。

例如下面是合理的:

class N

    {

        interface IU { }

        class CU { }

}

interface IB

    {

        interface IU { }

        class CU { }

    }

或者

interface IB

    {

        interface IU { }

    }

是通不过编译的。

  1. 类如何做到隐藏接口中的实现方法?

如果一个类实现了一个接口中的方法M,则M应该声明为public,否则编译无法通过。但是如何让类的引用无法使用接口中的方法M呢?例如

http://images.cnblogs.com/cnblogs_com/edenia/243832/r_HideMethodsFromInterface.JPG

看上图,你会发现对象a的方法列表中并没有方法M。如何做到呢?

http://images.cnblogs.com/cnblogs_com/edenia/243832/r_HideMethodsFromInterface_1.JPG

是的,通过接口名称限定类中实现的接口中的方法。

像上面那样,如何访问到M呢?通过接口类型的引用访问即可,例如IA a = new CA();。

再讨论这样做是否有意义?

接口是为不相关的类提供通用的功能的,像上面,如果M对类CA的引用是隐藏的,我们完全可以将M这样的方法脱离出来再定义一个接口就哦可了。所以照这样说,上面那种做法是没有必要的。

原创粉丝点击