我看《我是谁?[C#]》

这几天正在学习有关接口的知识,看到博客园期刊上刊登了一篇名为《我是谁?[C#]》的文章,作者用生动有趣的语言对接口进行了深入的分析,感觉非常不错。看完后也想发表一点自己的看法,但是没法在期刊上回复,就写在这儿了。

接口是一个公开的约定,利用接口可以实现与未知的代码用一种通用的方法进行通信。接口定义了自己的成员却不提供任何实现,当然也无法被实例化。

当一个类继承某个接口时,这个类就理所当然的有了实现接口所规定的全部成员的义务。至于这个类还能不能干点其他的事,接口非常开明,它可能在说“这些我不管,只要你能干完我要求的活就行。”,所以,从接口继承的类完全可以具有其他非常多的功能,而这一切甚至与接口没有关系,正如原文示例中的N()。

再回到原文:
 有一个 interface ABC 包括了如下的方法 M()

public interface ABC
{
    
void M();
}

      另外有个类 Class1 继承了 ABC 并且拥有自己的方法 N()

public class Class1 : ABC
{
    
public Class1() {}

    
public void M()
    
{
        Console.WriteLine("Now we are in Class1, using method which inherit from Interface ABC ");
    }

    
public void N()
    
{
        Console.WriteLine("Now we are in Class1, we used method which not inherit from Interface ABC ");
    }
}

看看M()到底属于谁,从Class1的代码看,毫无疑问,M()是Class1的一个公共方法,比较特殊的是,M()比较能干,它同时担负起了为ABC实现M()的义务。

当我们声明:ABC t = new Class1(); 的时候,我们一定是想使用ABC的功能,而不是Class1,否则我想一定会改成这样的: Class1 t=new Class1(); 虽然我们确确实实new了一个Class1,但我们new出来的对象还同时是ABC,Class1只是在幕后为ABC做了实现而已,至于Class1还能做什么,我们根本无从得到。开明的ABC自然不会把Class1的功能全盘托出,否则你直接找Class1得了。

事实上,我们完全可以让Class1的一个方法去实现ABC,而这个方法不必公开,Class1甚至可以拥有一个同名的方法M()去做自己的事情。看下面的代码:

 1public class Class1:ABC
 2{
 3    public void M()
 4    {
 5        Console.WriteLine("Now we are in Class1, But using method which not inherit from Interface ABC ");
 6    }

 7
 8    void ABC.M()
 9    {
10        Console.WriteLine("Now we are in Class1, using method which inherit from Interface ABC ");
11    }

12
13    public void N()
14    {
15        Console.WriteLine("Now we are in Class1, we used method which not inherit from Interface ABC ");
16    }

17}

18

现在再进行如下调用:

1ABC t = new Class1();
2t.M();

可以想到的结果自然是:Now we are in Class1, using method which inherit from Interface ABC

而如果调用改成:

 Class1 t2=new Class1();
2t2.M();

结果将会是:Now we are in Class1, But using method which not inherit from Interface ABC

显然,编译器非常明晰的分清了实现ABC的M()与Class1自己的M()。现在反过来想一想,我们怎么能要求用ABC声明的t去实现N()呢。

posted @ 2005-12-19 21:35  同一片海  阅读(634)  评论(0编辑  收藏  举报