资料:
[A] C# 的类型体系(引用类型与值类型):
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/value-types
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types (重点,关注 decimal 这种值类型的使用)
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/struct (研究下struct与class的异同,什么时候适合用struct)
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/nullable-value-types (重点,此为Java没有的功能)
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/reference-types
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/reference-types (重点,关注字符串、dynamic的概念及用法)
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/class
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interface
[B] C# 的面向对象编程(第一部分)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/object-oriented-programming (重点,注意延伸阅读、以及与Java异同)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/properties
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/using-properties (重点,用的很多、很方便、且为Java没有的功能)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables (研究下var何时使用、何时不使用)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters (可以延伸了解下 in, out, ref 三个关键字)
[C] C# 的面向对象编程(第二部分,继承与多态。虽然概念相似,但实现上有不少与Java的差异点,注意自己找其他资料)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/inheritance
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/polymorphism
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/override
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/sealed
练习题:
新建一个 Solution, 包含两个 Project。
Project #1:
这是一个 Class Library Project,在这个 Project 里包含如下类结构(综合利用面向对象编程中的继承和多态, override, abstract, virtual...)
[接口A]
对外提供一个功能:“基于文件名检索文件”
※入参、返回值请自定义
[抽象类B(接口A的默认实现)]
实现了接口A的功能,方法里包含这样的步骤:
1. 检查路径的合法性
2. 列出路径下的所有文件
3. 对2的结果进行条件过滤 (方法调用)
4. 对3的结果进行排序(方法调用)
5. 返回4的结果
对于 3. 在抽象类 B 中写一个虚实现:只要文件名中包含关键字就作为返回对象
对于 4. 在抽象类 B 中写一个抽象方法,依赖抽象类 B 的子类去实现
[实现类C(继承抽象类B)]
重写上记 3.:只有当文件扩展名与输入的关键字相同时、将该文件作为返回对象
重写上记 4.:按字母顺序正序排列,取前10条
[实现类D(继承抽象类B)]
重写上记 4.:按文件大小倒序排列,返回所有结果
[实现类E(继承抽象类B)]
重写上记 3.:只有当文件扩展名与输入的关键字相同将该文件作为返回对象
重写上记 4.:按字母顺序正序排列,返回所有结果
Project #2:
这是一个 Console App,接受用户的输入(路径、关键字、搜索类型),并返回结果。
在这里调用 Project #1 去完成搜索的操作,要求:
- 主方法所在的类只含有接口A的引用,它并不知道具体要使用哪个实现类去处理用户请求;
- 再写一个工具类(工厂类),它根据主方法传入的搜索类型返回一个实现类
注意返回的类型仍然是接口A,保证主方法只面向接口
- 将用户输入包装到一个类中(类似于 Java Bean),并使用 Property (自动 setter getter)
进阶要求 #1
Project #2的工厂类里,现在仍然需要手动 new 一个接口A的实现类返回给调用方,
更进一步,使用反射+配置文件的方式使工厂类也不引用实现类,也就让 Project #2 完全面向接口编程。
配置文件的格式:[搜索类型]:[实现类全名(如edu.csharp.filesearch.impl.Impl1)],文件可以有多行
进阶要求 #2
将 Console App 换成图形界面。