理论教育 内部类和外部类实例

内部类和外部类实例

时间:2023-11-24 理论教育 版权反馈
【摘要】:在类中定义类,即定义内部类和外部类。在Java语言中,Java的内部类从属于外部类,在Scala中,Scala的内部类和外部类类型更符合常规,例如,同一家公司的职员内部可以互相加联系人,而不同的公司则不能增加。内部类、外部类如例2-4所示。myFacebook公司增加两名员工:staff1_ myFacebook和staff2_myFacebook,staff1_myFacebook和staff2_myFacebook是内部类,属于myFacebook外部类;myTwitter公司增加一名员工staff1_myTwitter,staff1_myTwitter是内部类,属于myTwitter外部类。Scala内部类、外部类类型投影示例。

内部类和外部类实例

在Scala中,可以在语法结构中内嵌语法结构,例如,可以在函数中定义函数,在类中定义类。在类中定义类,即定义内部类和外部类。在Java语言中,Java的内部类从属于外部类,在Scala中,Scala的内部类和外部类类型更符合常规,例如,同一家公司的职员内部可以互相加联系人,而不同的公司则不能增加。如果要增加,需要通过类型投影来实现跨公司加联系人。

(1)内部类、外部类

定义一个外部类Outer,在外部类里面再定义一个内部类,可以使用Outer=>给外部类起一个别名叫Outer,然后在内部类Inner就能通过Outer直接引用Outer的属性方法。

内部类、外部类如例2-4所示。

【例2-4】外部类Outer、内部类Inner。

978-7-111-54169-1-Chapter02-20.jpg

示例代码运行如图2-5所示。调用内部类innerl的foo方法,打印输出外部类名称Spark以及内部类名称Scala;调用内部类inner2的foo方法,打印输出外部类的名称Hadoop及内部类名称Java。

978-7-111-54169-1-Chapter02-21.jpg

图2-5 内部类、外部类

在Scala交互式命令行,输入外部类Outer及内部类Inner的定义,输入Inner1.foo(In⁃ner2),调用Inner2内部类,会清楚地看到Outer2.Inner与Outer1.Inner的类型不匹配(type mismatch)。如例2-5所示。

【例2-5】Scala Inner1.foo(Inner2)调用类型不匹配示例。

978-7-111-54169-1-Chapter02-22.jpg

978-7-111-54169-1-Chapter02-23.jpg

可以通过类型投影Outer#Inner来解决内部类调用问题,在实际开发中需根据业务逻辑的需要来实现,避免混乱。示例如下:

978-7-111-54169-1-Chapter02-24.jpg

这样,Inner1.foo(Inner2)就能运行了,执行的结果为Outer:Spark Inner:Java。

(2)类型投影解决内部类调用问题示例(www.daowen.com)

定义一个外部类Company,在外部类Company里面定义一个内部类Staff;外部类Com⁃pany即公司,公司类里面包括职员类、职员数组集、新加员工方法;内部类Staff职员里面有一个联系人属性。

978-7-111-54169-1-Chapter02-25.jpg

那么现在有两家公司:myFacebook和myTwitter。myFacebook公司增加两名员工:staff1_ myFacebook和staff2_myFacebook,staff1_myFacebook和staff2_myFacebook是内部类,属于myFacebook外部类;myTwitter公司增加一名员工staff1_myTwitter,staff1_myTwitter是内部类,属于myTwitter外部类。

staff1_myFacebook、staff2_myFacebook同属于一家公司(myFacebook外部类),因此可以互加联系人。staff1_myFacebook.contacts+=staff2_myFacebook。

staff1_myFacebook、staff1_myTwitter分别属于不同的公司(myFacebook外部类、myTwit⁃ter外部类),因此两者暂还不能互加联系人。Scala IDE提示报错信息type mismatch;found:myTwitter.Staff required:myFacebook.Staff,表明两者的类型不同。

通过类型投影Company#Staff来处理,如下所示:

978-7-111-54169-1-Chapter02-26.jpg

这样,staff1_myFacebook、staff1_myTwitter现在可以互加联系人了:

978-7-111-54169-1-Chapter02-27.jpg

外部类Company、内部类Staff示例如例2-6所示。

【例2-6】Scala内部类、外部类类型投影示例。

978-7-111-54169-1-Chapter02-28.jpg

978-7-111-54169-1-Chapter02-29.jpg

运行结果如图2-6所示。打印输出myFacebook公司的职员名单staff1_myFacebook、staff2_myFacebook;打印输出myTwitter公司的职员名单Staff1_myTwitther。

978-7-111-54169-1-Chapter02-30.jpg

图2-6 类型投影Company#Staff

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈