1. 环境
Visual Studio 2017,Windows10 企业版。
注:本次练习类名和接口均采用中文书写,算是对 Visual Studio 的测试,也省去一些解释,一目了然。不建议在正式项目中使用中文命名法。
在 Visual Studio 2017 下创建一个解决方案 MyCsharp,其中新建两个项目,分别是Ex03 (类库/.net framework ) 和 ConsoleNET(控制台应用程序/.net framework)。
2. 代码
1)项目 Ex03(类库/.net framework )
namespace MyCsharp.Ex03
{
public interface I接口
{
void 输入(string 输入值);
string 输出();
}
public class 甲 : I接口
{
public void 输入(string a)
{ }
public string 输出()
{ return "来自甲的输出。"; }
}
public class 乙 : I接口
{
public void 输入(string a)
{ }
public string 输出()
{ return "来自乙的输出。"; }
}
public class 丙 : I接口
{
public void 输入(string a)
{ }
public string 输出()
{ return "来自丙的输出。"; }
}
// 接口作用最关键的点睛之处,将上述几个类统一。
// 接口的优点具体在下文 方法二 可见。
public class 协作
{
// 接口常用方法——接口作为参数
public void 输入(I接口 接口名)
{ }
public string 输出(I接口 接口名)
{ return 接口名.输出(); }
// 接口作为返回值
public I接口 输出()
{
return new 甲; // 返回实例化的类,不建议这种写法
}
}
}
2)项目 ConsoleNET( 控制台应用程序/.net framework )
using System;
namespace ConsoleNET
{
class Program
{
static void Main(string[] args)
{
//方法一:通过接口启用协作
MyCsharp.Ex03.I接口 协作接口;
协作接口 = new MyCsharp.Ex03.甲();
Console.WriteLine( 协作接口.输出() );
协作接口 = new MyCsharp.Ex03.丙();
Console.WriteLine( 协作接口.输出() );
//方法二:通过封装的类关联多个类,接口作为参数
MyCsharp.Ex03.协作 my协作 = new MyCshcarp.Ex03.协作();
my协作.输出(new 甲); //引用 甲类,实现 甲.输出()
my协作.输出(new 乙); //引用 乙类,实现 乙.输出()
//方法三:通过封装的类关联多个类,接口作为返回值
my协作.输出().输出(); // 这里需要好好体会和理解,两个"输出"的含义是不一样的。
Console.ReadKey();
}
}
}
3)运行结果:
4)项目 Ex03 编译后生成的 Ex03.dll 结构
3. 小结
把项目 ConsoleNET 代码中的 甲(类) 和 丙(类) 换成 MSSQL 和 Oracle 数据驱动,或其他数据库驱动,是不是感觉与 ADO.NET 连接不同数据库驱动代码相似。
另:接口的优点为:
假设某接口有A/B/C三个类,常规写法是:
接口 实例 = new 实现接口的类A()
接口 实例 = new 实现接口的类B()
接口 实例 = new 实现接口的类C()
这样的逻辑就是说,我们需要某个类,所以我们每次实例化它。
如果把 ABC这三个类,再用一个类封D装起来,会怎么样呢?
接口 实例 = D.A
接口 实例 = D.B
接口 实例 = D.C
我们还是需要某个类,但是,我们不需要每次都实例化了,只需要找D“拿”就行。