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

作者学习接口知识时看到《我是谁?[C#]》文章,受启发分享看法。介绍接口是公开约定,定义成员却不实现、无法实例化。通过代码示例分析类继承接口后成员的归属及使用情况,还提及编译器能分清实现接口的方法和类自身方法。

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

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

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

再回到原文:
 有一个 interface ABC 包括了如下的方法 M() <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />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()去做自己的事情。看下面的代码:

 1 None.gif public   class  Class1:ABC
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    public void M()
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif        Console.WriteLine("Now we are in Class1, But using method which not inherit from Interface ABC ");
 6ExpandedSubBlockEnd.gif    }

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

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

17ExpandedBlockEnd.gif}

18 None.gif

现在再进行如下调用:

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

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

而如果调用改成:

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

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

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

转载于:https://www.cnblogs.com/chinadhf/archive/2005/12/19/300463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值