分享

抽象类和接口细节分析

 秋寒月 2011-05-25
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呢?例如
 
看上图,你会发现对象a的方法列表中并没有方法M。如何做到呢?
 
是的,通过接口名称限定类中实现的接口中的方法。
像上面那样,如何访问到M呢?通过接口类型的引用访问即可,例如IA a = new CA();。
再讨论这样做是否有意义?
接口是为不相关的类提供通用的功能的,像上面,如果M对类CA的引用是隐藏的,我们完全可以将M这样的方法脱离出来再定义一个接口就哦可了。所以照这样说,上面那种做法是没有必要的。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenshizero/archive/2010/05/18/5605510.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多