(抽象)类和接口细节分析
- 抽象类是否可继承接口?
抽象类里面可以包括抽象方法和非抽象方法,而接口只是定义了方法的原型,没有方法的具体定义。从这方面来分析,抽象类是可以继承接口的。
- 抽象类继承接口后,一定要实现接口中的成员方法么?
答案是否定的。
抽象类继承接口后,可以实现接口中的成员方法,也可以不实现。如果不实现接口中成员方法,只需将该方法声明为abstract类型就可以了。
interface ITemp
{
void IM();
}
abstract class CTemp : ITemp
{
public abstract void IM();
}
- (抽象)类继承类和接口的顺序是如何的?
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这样的顺序继承,就不存在这样的情况了。
- 接口可以继承抽象类么?
接口只定义成员方法的原型,并不包括成员方法的实现。抽象类里面可能有实现的方法。如果说,接口可以继承抽象类,那这就和“接口只声明成员方法的原型,而没有具体方法的定义”相违背。
所以说,接口不能继承抽象类。
- 接口中可以包含属性和事件,但是不可以包含字段。
属性和事件在编译的时候编译器会自动将其转化成方法。
- 接口中不能再声明类型。例如接口中不能再定义类,不能再声明接口等等,但是类里面可以再定义类,再声明接口。
例如下面是合理的:
class N
{
interface IU { }
class CU { }
}
而
interface IB
{
interface IU { }
class CU { }
}
或者
interface IB
{
interface IU { }
}
是通不过编译的。
- 类如何做到隐藏接口中的实现方法?
如果一个类实现了一个接口中的方法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这样的方法脱离出来再定义一个接口就哦可了。所以照这样说,上面那种做法是没有必要的。