第七天与第八天综合作业
7.1 抽象类的基本概念及使用 7.2 抽象类练习
抽象类与其它的类有什么区别呢?
抽象类是不能够被实例化的。如果一个类中包含有抽象方法,那么这个类一定要声明为抽象类。同时,抽象方法一定需要在子类中重写,让抽象方法成为一个具体的实实在在的方法。
相信大家在网上一定看过很多这类解释了吧?好吧,不理解的我们一起来看看通俗易理解的说法吧:
比如说:我们需要创建 “狗”、“猫”、“鱼”、“马”这些对象(类),我们可以说他们有一些共同的属性像嘴巴、尾巴、重量、颜色、大小等等一些共同的属性(properties),但是它们彼此的属性的形状是不同的(如嘴巴),在这种情况下,我们如果一个个去定义各自类似的属性是不是比较繁琐?如果用抽象类是不是很方便的给他们去继承。抽象类也有个更加好的地方,体现在“同质异像”就是实质相同实现形式不同的方法继承上,例如上面的狗、猫、马等的呼吸这个方法或者跑的速度的方法形式不同,我们这个是用定义一个抽象方法,让他们各自的类去实现它是不是很方便。“抽象”的意义正在于此。将共同的东西抽出来封装,但不实现只给继承。
C# abstract抽象类的作用与使用场景
【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法
接口、抽象类、封装、继承、多态的综合案例
8.1 接口的基本概念及其使用
由于C#不支持多重继承,但是客观世界出现多重继承的情况又比较多。为了避免传统的多重继承给程序带来的复杂性等问题,同时保证多重继承带给程序员的诸多好处,C#提出了接口概念。通过接口实现多重继承的功能。
接口用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。接口描述可属于任何类或结构的一组相关行为。接口可由方法、属性、事件、索引器或这四种成员类型的任何组合构成。接口不能包含字段。接口成员一定是公共的。
类和结构可以像类继承基类或结构一样从接口继承,但是可以继承多个接口。当类或结构继承接口时,它继承成员定义但不继承实现。若要实现接口成员,类中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器。例如,接口可以声明一个带有GET访问器的属性,而实现该接口的类可以声明同时带有get和SET访问器的同一属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。
接口可以继承其他接口。类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员;在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。
接口概念、定义接口、接口继承(C#)
8.2 显示实现与隐式实现
-
隐示实现 接口和类都可以访问
-
显示实现 只有接口可以访问
-
显示实现的益处
1:隐藏代码的实现;
2:在使用接口访问的系统中,调用者只能通过接口调用而不是底层的类来访问。
-
显示实现接口说明:
1、不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显式接口成员执行体。事实上,显式接口成员执行体只能通过接口的实例,也就是仅仅引用接口的成员名称来访问;
2、显式接口成员执行体不能使用任何访问限制符,也不能加上abstract, virtual, override或static 修饰符,即使是public也不可以;
3、显式接口成员执行体和其他成员有着不同的访问方式。因为不能在方法调用、属性访问以及索引指示器访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的。但它们又可以通过接口的实例访问,也具有一定的公有性质;
4、只有类在定义时,把接口名写在了基类列表中,而且类中定义的全权名、类型和返回类型都与显式接口成员执行体完全一致时,显式接口成员执行体才是有效的;
5、一个类中既显示又隐式的实现接口,这时显式实现方法只能通过接口的引用来直接访问,隐式实现方法只可以通过类的实例来直接访问;
6、一个类如果实现恶劣多个接口,并且这多个被实现的接口含有相同签名的接口声明,那么如果其中有一个被显式实现,那么其它接口中同签名的方法也必须被显式实现。
为什么要显示实现接口呢,有如下好处:
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。
显示接口实现与隐式接口实现的适应场景
当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。
当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。即使没有相同的方法签名,仍推荐使用显式接口,因为可以标识出哪个方法属于哪个接口。
隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问。
c#显示实现接口和隐式实现的区别
显式实现接口和隐式实现接口的区别
8.3 数组与索引器
索引器和数组比较:
(1)索引器的索引值(Index)类型不受限制
(2)索引器允许重载
(3)索引器不是一个变量
索引器和属性的不同点
(1)属性以名称来标识,索引器以函数形式标识
(2)索引器可以被重载,属性不可以
(3)索引器不能声明为static,属性可以
C#中的索引器和数组有什么不同?
8.4 抽象类与接口的区别聊聊继承和组合
8.4.1 抽象类与接口的区别
相同点:
(1) 都可以被继承
(2) 都不能被实例化
(3) 都可以包含方法声明
(4) 派生类必须实现未实现的方法
区 别:
(1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
(2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
(3) 接口可以被多重实现,抽象类只能被单一继承
(4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
(5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
(6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
(7) 接口可以用于支持回调,而继承并不具备这个特点
(8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
(9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
C#中抽象类和接口的区别与使用
C#.NET里面抽象类和接口有什么区别
8.4.2 继承和组合
复用代码的方式:继承和组合
继承:复用代码的一种方式,可以复用代码或概念。
组合:复用代码,不能复用概念。
C#面向对象(二)继承和组合
1.抽象类可以被实例化对吗(为什么)?
不可以被实例化
2.下题中错误的描述(多选)?
I.抽象类中不能包含实例成员(错)
II.抽象方法在抽象类中不能有实现(对)
III.抽象成员不能使用访问修饰符(错)
IV.子类必须实现抽象父类中的抽象成员(对)
3.一个类可以实现多个接口对吗?
可以实现多个接口
4.接口中隐式实现与显示实现的区别?
隐式实现 接口和类都可以访问
显示实现 只有接口可以访问,显示接口成员的执行体不可以使用任何访问限制符,也不能加上abstract, virtual, override或static 修饰符,即使是public也不可以。
显式实现接口和隐式实现接口的区别
5.动手画一下下面表达式的内存图?
int[] arr = {1,2,3,4,5}
6.实现一个类索引器?
private string [] x = new string [y];
static public int y = 20 ;
public Program()
{
for (int i = 0; i < y; i++)
{
x[i] = "aaaa" ;
}
}
public string this[int index]
{
get { } set {
}
}
7.描述一下你所理解的抽象类与接口的区别?
区别还蛮多的,上面的学习资料里面有原文链接,两者的主要区别还是在动机上,抽象类更多的是为了代码的复用,接口则是为了多态性。
8.用代码描述一下组合关系?