c#接口问题 5
下列描述错误的是()a)类不可以多重继承而接口可以;b)抽象类自身可以定义成员而接口不可以;c)抽象类和接口都不能被实例化;d)一个类可以有多个基类和多个基接口;请问第二...
下列描述错误的是()
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;
请问第二选项,接口可以自定义成员吗?求详细讲解区别 展开
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;
请问第二选项,接口可以自定义成员吗?求详细讲解区别 展开
3个回答
展开全部
接口中不能有任何的实现,但接口中可以定义成员,但只能定义以下成员:
属性,方法,事件以及索引器。
而抽象方法的定义是是,只要对象中含有抽象方法的类,都是属于抽象类的。也就是说一个普通的类中有一个没有实现的方法(抽象方法)那么该类必须加关键词,说明其是一个抽象类。从这里可以看出抽象类与普通类的区别就是至少有一个方法没有实现,或者称至少含有一个抽象方法。所以在抽象类中是可以实现方法体的。那么对于字段与常数等都是不做要求的,而这些却不能在接口不定义。接口不不能实现任何方法的。
在翻译资料中,很多时间我们都丢失了另一个名字:纯抽象类,因为很多人对超类这个术语而感兴趣,所以往往以为纯抽象类指的就是超类,其实不是一样的,超类在java中指的就是抽象,它只用来被继承,不可能进行实例化,说白了它说是一个抽象类,而纯抽象类则指没有任何方法实现的类,也有人认为纯抽象类是一个范畴,接口就是属于纯抽象类,而抽象类若是没有任何方法体的实现时,也是属于纯抽象类。但不管怎么说,其实在翻译时由于它对我们编程时起不到多大的理解做用,而被翻译去掉了,我们的术语中没有人说纯抽象类,但事实上在其他的术语中还是存在的。
当然,定义接口的成员,包括任何成员,都是不可实现的,而字段一般是一个引用值,或是值类型,所以在接口中是不可能实现的。虽然属性可以,但属性同样不能有实现的。
定义与实现其实是两码事的,所以在接口中是可以定义成员的。
这是接口类是否可以定义成员的解释。 回过头来看问题:
我觉得大家虽然都找到B答案是错的,但是该选择支的理解是错误的。
该支的意义是,抽象类自身可以定义成员,它的意思显然是不是可以给抽象类定义很多成员,而是它是否可以做为其他类或是自身类的成员,换句话或说,这个抽类象是否可以是其实类的成员类型,结果当然是可以的。比如抽象类可以做为某一个类的反回类型,也可以做为一个字段的类型,当然也可以做为属性的类型的。所以这句话多了自身两个字,理解不应该是类可以定义成员那么简单了。而事实上接口与抽象类都可以做为返回类型或字段类型的。
如果没有单独的语境,其实在C++中是可以实现多重继承的,我们的多重继承指的是一个类拥有多于一个的父类。也可以说可以继承于两个类的,而在单继承语言中是不可以的。C#是一个单继承语言,所以A的选支必须在有语境的时间才是对的。
不过这里的题也比较乱,这个是由于面向对象术语的不统一造成的。在java中,一个说基类,派生类,而在C#中一般说父类,子类。java中的超类实际就是C#中的抽象类。术语的语系环境还是不一样的。要是非要C#中说基类派生类也是未尝不可,因为C#与java的交流有很多的。术语混合着来也是一样的,但如果是正规的文献中,出现这种,怕是有点别扭了——因为在C#中的基类被另有所指,一般指的基类是最基础的类型——比如int等等。当然它虽然指的是最基础的类型,但它不愿意指的是原始类,如果说最最基础的怕是在C#中只有一种类型——object,如果非要再详细点,那么只可能有valuetype值类型, 如果是这样,基类的存在是没有意义的——这也是为什么在C#术语中基类没有被方泛使用的原因。换句话来说,基类在C#中,一种是为了沿用java,一种是指的最基础的类型都是不正规的称呼。所以在于D支上 ,是有些不正规的。一个类可以有多个基类的原因是因为类的线性继承,比如B类继承于A,C为继承于B,而A,B都可以做为C的基类(它不是Java中的基类,否则一个派生类只可能有一个基类),而接口可以通过多重继承,一个类可以继承很多个接口——一些无聊人的研究说可以继承127个接口,这可能与参数列表相关,但它不影响我们正常的编程,我也没那么无聊。但是接口最好不要继承接口,只能让类隐式线性继承,如果重复继承会引起不必要的麻烦的。比如:A类继承于IA接口,B类继承于A类,其实B类必须实现IA接口,这是一种隐式继承,如果你非写成B:A,IA,就是一种重复继承了,没有实际没有多大的意义了。
属性,方法,事件以及索引器。
而抽象方法的定义是是,只要对象中含有抽象方法的类,都是属于抽象类的。也就是说一个普通的类中有一个没有实现的方法(抽象方法)那么该类必须加关键词,说明其是一个抽象类。从这里可以看出抽象类与普通类的区别就是至少有一个方法没有实现,或者称至少含有一个抽象方法。所以在抽象类中是可以实现方法体的。那么对于字段与常数等都是不做要求的,而这些却不能在接口不定义。接口不不能实现任何方法的。
在翻译资料中,很多时间我们都丢失了另一个名字:纯抽象类,因为很多人对超类这个术语而感兴趣,所以往往以为纯抽象类指的就是超类,其实不是一样的,超类在java中指的就是抽象,它只用来被继承,不可能进行实例化,说白了它说是一个抽象类,而纯抽象类则指没有任何方法实现的类,也有人认为纯抽象类是一个范畴,接口就是属于纯抽象类,而抽象类若是没有任何方法体的实现时,也是属于纯抽象类。但不管怎么说,其实在翻译时由于它对我们编程时起不到多大的理解做用,而被翻译去掉了,我们的术语中没有人说纯抽象类,但事实上在其他的术语中还是存在的。
当然,定义接口的成员,包括任何成员,都是不可实现的,而字段一般是一个引用值,或是值类型,所以在接口中是不可能实现的。虽然属性可以,但属性同样不能有实现的。
定义与实现其实是两码事的,所以在接口中是可以定义成员的。
这是接口类是否可以定义成员的解释。 回过头来看问题:
我觉得大家虽然都找到B答案是错的,但是该选择支的理解是错误的。
该支的意义是,抽象类自身可以定义成员,它的意思显然是不是可以给抽象类定义很多成员,而是它是否可以做为其他类或是自身类的成员,换句话或说,这个抽类象是否可以是其实类的成员类型,结果当然是可以的。比如抽象类可以做为某一个类的反回类型,也可以做为一个字段的类型,当然也可以做为属性的类型的。所以这句话多了自身两个字,理解不应该是类可以定义成员那么简单了。而事实上接口与抽象类都可以做为返回类型或字段类型的。
如果没有单独的语境,其实在C++中是可以实现多重继承的,我们的多重继承指的是一个类拥有多于一个的父类。也可以说可以继承于两个类的,而在单继承语言中是不可以的。C#是一个单继承语言,所以A的选支必须在有语境的时间才是对的。
不过这里的题也比较乱,这个是由于面向对象术语的不统一造成的。在java中,一个说基类,派生类,而在C#中一般说父类,子类。java中的超类实际就是C#中的抽象类。术语的语系环境还是不一样的。要是非要C#中说基类派生类也是未尝不可,因为C#与java的交流有很多的。术语混合着来也是一样的,但如果是正规的文献中,出现这种,怕是有点别扭了——因为在C#中的基类被另有所指,一般指的基类是最基础的类型——比如int等等。当然它虽然指的是最基础的类型,但它不愿意指的是原始类,如果说最最基础的怕是在C#中只有一种类型——object,如果非要再详细点,那么只可能有valuetype值类型, 如果是这样,基类的存在是没有意义的——这也是为什么在C#术语中基类没有被方泛使用的原因。换句话来说,基类在C#中,一种是为了沿用java,一种是指的最基础的类型都是不正规的称呼。所以在于D支上 ,是有些不正规的。一个类可以有多个基类的原因是因为类的线性继承,比如B类继承于A,C为继承于B,而A,B都可以做为C的基类(它不是Java中的基类,否则一个派生类只可能有一个基类),而接口可以通过多重继承,一个类可以继承很多个接口——一些无聊人的研究说可以继承127个接口,这可能与参数列表相关,但它不影响我们正常的编程,我也没那么无聊。但是接口最好不要继承接口,只能让类隐式线性继承,如果重复继承会引起不必要的麻烦的。比如:A类继承于IA接口,B类继承于A类,其实B类必须实现IA接口,这是一种隐式继承,如果你非写成B:A,IA,就是一种重复继承了,没有实际没有多大的意义了。
展开全部
b)抽象类自身可以定义成员而接口不可以;
我觉得题目表述有问题,“定义成员”应该说是“实现成员”更确切
下面的A类可以自定义成员functionA2方法,这个方法的方法体就是{}内的
B接口的functionB2却不可以包含方法体{}
所以在下面的定义中,A类的定义是正确的,B接口的定义是错误的,就是因为functionB2不可以有方法体。
public abstract class A
{
public abstract void funtionA1();
void functionA2() { }
}
public interface B
{
void funtionB1();
void functionB2() { }
}
我觉得题目表述有问题,“定义成员”应该说是“实现成员”更确切
下面的A类可以自定义成员functionA2方法,这个方法的方法体就是{}内的
B接口的functionB2却不可以包含方法体{}
所以在下面的定义中,A类的定义是正确的,B接口的定义是错误的,就是因为functionB2不可以有方法体。
public abstract class A
{
public abstract void funtionA1();
void functionA2() { }
}
public interface B
{
void funtionB1();
void functionB2() { }
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
接口是不能自定义字段,属性和方法是可以的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询