接口

接口与实现类

接口(interface)可以看作是一系列类型的模板,其中,可以定义的成员包括属性(property)、方法(method)、索引器(indexer)和事件(event);但有一点,这些成员都不是真的实现,而是要求实现接口的类必须包含这些成员。

下面的代码,我们创建名为IUnit的接口类型。

C#
public interface IUnit
{
    string Name { get; set; }
    void Attack(int x, int y);
}

下面的代码,我们使用CUnit1和CUnit2类来实现IUnit接口。

C#
using System;
public class CUnit1 : IUnit
{
    public string Name { get; set; }
    public void Attack(int x, int y)
    {
        Console.WriteLine("{0} 使用机枪攻击({1},{2})",Name,x,y);
    }}public class CUnit2 : IUnit
{
    public string Name { get; set; }
    public void Attack(int x, int y)
    {
        Console.WriteLine("{0} 使用火炮攻击({1},{2})", Name, x, y);
    }
}

下面在Main()方法中测试这些类型。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            IUnit unit1 = new CUnit1 { Name = "unit1"};
            IUnit unit2 = new CUnit2 { Name = "unit2" };
            unit1.Attack(10, 99);
            unit2.Attack(10, 99);
        }
    }
}

代码执行结果如下图。

使用接口的好处在于,可以不改变应用类型的情况下修改具体的实现,如下面的代码。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            IUnit unit = new CUnit1 { Name = "unit1"};
            unit.Attack(10, 99);
            unit = new CUnit2 { Name = "unit2" };
            unit.Attack(10, 99);
        }
    }
}

本例,我们只使用一个IUnit接口类型的对象unit,但它可以实例为实现此接口的所有类型,如CUnit1和CUnit2。代码执行结果与上图相同。

接口的继承

类只能从一个基类中继承,但类和接口可以实现或继承多个接口,如下面的代码,我们创建了I1、I2和I3三个接口类型。

C#
public interface I1
{
    void Method1();
    void Method9();
}
public interface I2
{
    void Method2();
    void Method9();
}
public interface I3 : I1,I2
{
    void Method3();
}

其中,I1和I2接口都分别定义了两个方法,而I3接口继承了I1和I2;请注意,I1和I2接口中包含了同名的Method9()方法。下面的代码,我们使用C3类来实现I3接口。

C#
using System;
public class C3 : I3
{
    public void Method1()
    {
        Console.WriteLine("method1 is working");
    }
    public void Method2()
    {
        Console.WriteLine("method2 is working");
    }
    public void Method9()
    {
        Console.WriteLine("method9 is working");
    }
    public void Method3()
    {
        Console.WriteLine("method3 is working");
    }
}

本例,假设I1和I2接口中的Method9()方法是相同功能,就可以使用一个方法来实现它们。下面的代码,我们在Main()方法中进行测试。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            I1 c1 = new C3();
            I2 c2 = new C3();
            I3 c3 = new C3();
            c1.Method1();
            c1.Method9();
            c2.Method2();
            c2.Method9();
            c3.Method1();
            c3.Method2();
            c3.Method3();
            (c3 as I1).Method9();
        }
    }
}

代码执行结果如下图。

本例,虽然c1、c2和c3对象都实例化为C3类,但它们定义的类型分别是I1、I2和I3接口类型,所以,它们只能调用相应接口定义的成员。而在c3对象中调用Method9()方法是,则明确它是在调用I1接口的Method9()方法。

在C3类中,如果I1和I2接口中的Method9()方法应该是不同的实现,则需要通过接口名称加以区别,如下面的代码。

C#
using System;
public class C3A : I3
{
    public void Method1()
    {
        Console.WriteLine("method1 is working");
    }
    public void Method2()
    {
        Console.WriteLine("method2 is working");
    }
    public void Method3()
    {
        Console.WriteLine("method3 is working");
    }
    void I1.Method9()
    {
        Console.WriteLine("I1.method9 is working");
    }
    void I2.Method9()
    {
        Console.WriteLine("I2.method9 is working");
    }
}

下面的代码,在Main()方法中测试C3A类的使用。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            I3 c3a = new C3A();
            c3a.Method1();
            c3a.Method2();
            c3a.Method3();
            (c3a as I1).Method9();
            (c3a as I2).Method9();
        }
    }
}

代码执行结果如下图。

using语句结构与IDisposable接口

using关键字除了引用命名空间,还是一种语句结构,其使用格式如下。

C#
using(<定义对象>){
    // 使用对象
}

在这个结构中,对象使用后会自动调用Dispose()方法进行清理工作。这里,Dispose()方法是IDisposable接口成员,也就是说,在using语句结构中使用的对象必须是使用了IDisposable接口的类型。

下面的代码,我们创建一个C4类,它实现了IDisposable接口。

C#
using System;
public class C4 : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("C4对象自动清理");
    }
}

下面的代码,我们在Main()方法中测试C4类的使用。

C#
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            using (C4 c4 = new C4())
            {
                // 做点啥
            }
        }
    }
}

代码执行结果如下图。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc002010