首先需要明白什么是继承?为什么需要继承?继承的是什么?
软件工程里面,有个很重要的事情,就是“代码复用”,将需要重复使用的代码抽取出来,封装成函数,便是最简单的复用。此处还没有继承的概念,当OOP的思想出来后,出现了“类”——数据与行为的封装体。在类里面,数据被称之为属性(Attribute);而行为则被称之为函数(Funcation)或者方法(Method)。复用也就是复用这些个东西。什么情况下需要复用呢?当我们的代码有一部分功能已经完成,而我们对其功能感觉还不足以满足我们的需求,那么便要对其改造。当然,我们不能直接修改已经完成的代码,只能退而求其次,将他的代码复制过来,然后把不满意的地方进行修改!这样短暂的满足了要求,但是问题又来了,原来的类升级了,部分功能更新了。我拿来一瞧,倘若改的是我们拿来之后改过的部分,那倒没什么问题,反正我们还是要改的。但如果改的是其他我们需要的功能,那么,我们必须再次拿出代码来复制一遍。这样的做法,谈不上复用。那么如何才能复用呢?继承,继承什么,继承一个类。类里面有什么,我们就可以继承什么。属性、方法都可以被继承!
首先继承过后的类跟原来的类不是一个类,他们之间的关系很简单,新的类知道自己扩展的是谁,而反过来不行。例如A extends B,B是不知道被A继承了的,只有通过A类去反推才能得知。A可以看做是B的另外一个版本。B不具备或者不满足的功能,在A里面重新做一下。这里有一个问题需要讲一下,类里面包含了对象的信息,而对象在内存里面,仅仅包含了数据,而没有方法,所有的方法都在类里面,当我们对某个对象的引用调用其方法时,等于将内存中,该对象的数据交给其方法去处理,那么此时就有个方法定位的问题。很明显,调用方法时就已经指明了调用这个方法的对象,那么从该对象的类开始搜寻,如果搜到该方法,则调用之,若搜索不到,则向上搜寻其超类,以此类推,直到搜到为止。如果自身存在和超类中一致的方法,根据自身优先原则,自身的方法将被调用,那么超类中的方法很自然就被遮盖了。注意此处的用词,为遮盖而不是替换,超类中的方法依然存在,只不过不会被调用而已。这个现象即被称之为方法覆盖,又称之为重写(Override)。想要调用父类的方法,在方法内使用super关键字显性调用即可!
当我们的类不希望被继承(扩展),也即,设定某个类为最终版本,不允许有某个类对其进行继承,那么该类应当被修饰为final,当你尝试去继承一个final类时,会发生编译错误。而有些时候,我们并不完全限定死我们的类不被继承,而仅仅是限定某些方法不被重写(因为子类是可以冒充超类的),那么我们就需要将对应的方法修饰为final,也即,此方法为最终版本,不允许修改!重写一个final方法会引发编译错误。
那么此时有个额外的问题,子类能够重载(Overload)超类的final方法?
答案是可以!
无论是重载自身还是超类的方法,重载的方法之间,除了方法名一致外,还有其他联系么?很明显,方法签名最重要的部分是方法名和参数类型列表!而重载即为同名不同参,也即是说,重载的方法之间,除了方法名很凑巧的一致外,本质上根本就完全是两个不同的方法,毫无关系而言。
但重写不行,因为方法签名一致或者说是兼容吧,那么如何兼容法呢?
一个方法的申明,有以下元素组成:修饰符,返回值类型,方法名,参数列表,异常类型集合
子类跟超类某方法的签名完全一致当然是最好,这个绝对没问题。
那么是不是必须一致呢,必须一致的只有方法名和参数列表而已,其他的因情况而异
异常集合,当然跟参数列表不一样,是无序的,你可以写多个。但是有一个原则,你所有的异常范围不能超越超类里面该方法所申明的异常范围。否则的话,就是挂羊头卖狗肉,编译不会通过。
修饰符也一样,访问性不能更狭隘,可以平级,但是绝对不能将public的方法写成private,理由同上!
#include <iostream.h>
class A
{
public:
virtual void print(void)
{
cout<<"A::print()"<<endl;
}
};
class B:public A
{
public:
virtual void print(void)
{
cout<<"B::print()"<<endl;
};
};
class C:public B
{
public:
virtual void print(void)
{
cout<<"C::print()"<<endl;
}
};
void print(A a)
{
a.print();
}
void main(void)
{
A a, *pa,*pb,*pc;
B b;
C c;
pa=&a;
pb=&b;
pc=&c;
a.print();
b.print();
c.print();
pa->print();
pb->print();
pc->print();
print(a);
print(b);
print(c);
}
A:
A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()
A::print()
本地化的挑战
尽管语言障碍对很多地区的应用需求造成抑制,关注内容本地化厂商确实是闪耀的火花,从专职翻译(如Lionbridege)到人群翻译(如MyGengo,Transifex)和应用本地化专家(如Applingua,Mentez)。
但本地化不只是翻译,更多的是应用整体体验。本地化应用比只翻译语言包有更复杂的挑战。例如,中文和阿拉伯本地化常常需要布局改变,以及适配文化细微差异的配色方案。肖像通常需要为不同地区修改。
程序修改也是本地化的一部分,要适配不同的云API和基础设施需。例如:Evernote为开发者提供针对中国市场的不同数据存储和一套独立的API。
明确和获取本地内容(新闻、审核、服务合作伙伴)同样是全球开发者针对地区市场的一个挑战。本地开发者在理解和优化本地细微差异,以及与本地合作伙伴工作方面处于更有利的位置。
“进入亚洲市场的主要障碍是文化差异和获取/创建合适内容”Felipe Andrad,i2移动的产品&服务主管。
全球应用贸易路线
作为2012年开发者经济的部分,我们分析全球应用贸易路线,即应用从生产到下载的路径。我们将看看哪些开发者的应用本地下载更多亦或“出口”更多,以此分析各地区本地需求和全球需求的情况。
我们发现,大部分开发者大量的下载来自他们所在地区。这在北美和欧洲最为明显,有超过70%的开发者的下载大部分来自本地市场。这证明本地开发者能更好地满足本地需求,而非全球需求。然而,由于智能手机渗透率和用户参与度低,亚洲和拉美的本地需求相对低。
在所有地区中,北美是应用进口唯一的主导地,全球平均有36%开发者的前三大下载地区有北美。在北美,开发者看来来自其他地区的需求相对少,欧洲是他们最大的出口地,比随后的亚洲高少许。
在欧洲,有很强的本地应用需求,尽管有很大比例的欧洲开发者同时也看到来自北美的大量需求。
目前有16%的北美和欧洲开发者针对亚洲市场开发。不断增长的应用需求看来使亚洲正成为应用经济的重要组成部分,北美和欧洲的开发者开始作出响应,发布亚洲语言应用。北美和欧洲开发者有7%发布中文应用,有6%发布日语应用。
拉美和亚洲有很多开发者,分别是44%和38%,没有看到本地高需求,他们应用的前三下载地区没有他们所在地,他们主要是应用出口者。这些地区的开发者面向更能盈利的全球市场,如北美和欧洲,那里应用需求,特别是应用支付高很多。
一位阿根廷的移动web开发者认为“拉美目前对开发者只有很少机遇”。他解释道:“例如大部分的阿根廷开发者写英文应用,并向全球发布。”
然而,我们预期,在短短几年后,当智能手机渗透率提升以及人们应用参与更多,这些地区的本地需求将能达到欧洲和北美的水平。由于潜力增加,以及亚洲和拉美的市场规模,我们相信未来1千万应用主要针对这些市场生产和消费。
对开发者意味什么
我们已经描述了全球开发者的主要机遇,由金砖国家及其他新兴应用经济体推动需求增长,他们移动用户至少占全球的一半。要抓住这些机遇,开发者可关注两大策略:“reach-out(延伸)”和“search within(内部寻找)”。
采用“延伸”策略的开发者可针对国际应用需求,提供吸引跨国界和跨大陆的用户。这些应用可以到达很远的广泛的地方,但为了实现目标,要有适度的本地化。
采用“内部寻找”策略的开发者将着眼于本地市场的缺口和机遇。这些应用到达本地,需要很高程度的本地化。
为了进一步说明这些基于,我们将应用分为两大类:可流通应用 vs 非流通应用。
表:可流通 vs 非流通 应用
非流通应用(本地) 流通应用(全球) 描述 这些应用等同于非流通商品,即商品和服务不能由远方提供且保持实用性(如产权、本地交通和餐饮预订)。 这些应用等同于可流通商品,即商品和服务可以通过远程贸易获取(如冷冻食物,电子,服装) 例子 本地新闻(如Canal Touch),交通(如Tube Map,Ubercab),交易(如本地银行) 通信和社交网络(如Facebook,Skype),实用类(如Dropbox),参考(如维基百科),天气(如Accuweather),地图(如Google地图) 本地化 布局修改,配色方案,肖像,内容,服务合作伙伴关系。 菜单和内容的多种语言。本地云API。 贸易路线 本地到本地 本地到全球 机遇 各国非流通应用类型可寻址市场的缺口 明确哪些可流通应用在有限地区流行,并将之全球化。 地区 亚洲、拉美、东欧、俄罗斯和非洲的本地应用需求超出开发者供给。 智能手机渗透率达到适度水平的地区,那里用户的应用参与度正迅速增长。专注本地的开发者机遇在他们所在国家非流通应用类型的市场空缺,在本地需求超过开发者供给国家中机遇特别大,如亚洲、拉美、东欧、俄罗斯和非洲。
对于出口应用的开发者,机遇是让流通应用在少数地区流行,然后推向全球。在有适度智能手机渗透率水平地区,时机已经成熟,那里用户的应用参与度正迅速增长。
The End
相关链接:我的产业生态链和杂谈文章