|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。参数类(parametricclasses)
在Nice中有一种十分壮大的特征是能够界说参数类。参数类很像C++中的模板,大概相似别的函数型言语中的模子。而针对参数类的编程偶然也被称为泛型编程。
参数类就是有参数的类,在这类情形下参数更像一品种型而不是值。你能够把参数类以为是一族相干类,这些类除被参数化的部分之外有不异的举动和布局。参数类常被用于数据布局中。
示例3.4复杂Java汇合
classStack{
Listcontents=newLinkedList();
voidpush(Objecto){
contents.add(o);
}
//...omittedmethods
publicstaticvoidmain(String[]args){
Stackst=newStack();
st.push("Test");
Integernum=(Integer)st.pop();//Runtimeerror
}
}
这里有一个十分年夜的平安隐患。我将一个String压栈,然后试图将它弹进一个Integer中,这么做会招致一个运转时毛病。参数类可以办理这个成绩。
示例3.5复杂Nice汇合
classStack<T>{
List<T>contents=newLinkedList();
voidpush(Tt){
contents.add(t);
}
//...omittedmethods
}
voidmain(String[]args){
Stack<String>st=newStack();
st.push("Test");
Integernum=st.pop();//Compiletimeerror!
}
在Nice版的汇合中,我们有一个T范例的参数类Stack。实在Stack<T>是一种给编译器的旌旗灯号,它告知编译器怎样创立一个用于给定范例的Stack。当编译器得知我们只会把String放到这个栈中时,任何妄图从Stack<String>中掏出一个Integer的代码城市招致编译器报错。
接口声明
Nice和Java或C#一样只同意单承继,这意味着任何类只能从一个超类承继。偶然候,一个类从两个(或更多)类“承继”,从它的每一个父类取得举动和数据,如许大概会更好。在Nice中,这类情形能够像Java一样用接口往完成。
接口声明时就像类一样,只是接口只能包括办法,而不克不及包括数据成员。而和Java所分歧的是,Nice中的接口也能够包括办法的默许完成,如许就比Java中的接口更便利。
固然说了这么多仍是以Java的形式来熟悉接口。在Nice中一个接口其实不真正地包括任何工具,它只是一种标志。就像java.io.Serializable接口,只是一个标志,用来告诉Java能够对一个类的实例举行序列化。Nice中一切的接口都是标志,这是由于Nice中具有多元办法。多元办法由本人自己界说,而不包含在任何类或接口中。能够随时向接口中增加新办法,就像能够随时向类增加新办法一样。Nice基于多元办法的另外一个了局是接口不但能够“包括”办法署名,还能够“包括”办法的详细完成。
Nice可使用像Java一样的体例界说接口,就像上面的例子:
示例3.6界说接口
interfaceComponent{
StringgetID();
(int,int)getPosition();
(int,int)getDimensions();
intgetArea(){
(intwidth,intheight)=this.getDimensions();
returnwidth*height;
}
}
固然,能够等价地利用上面这类办法界说接口:
示例3.7在接口界说中包括全局办法
interfaceComponent{}
StringgetID(Componentcomp);
(int,int)getPosition(Componentcomp);
(int,int)getDimensions(Componentcomp);
intgetArea(Componentcomp){
(intwidth,intheight)=comp.getDimensions();
returnwidth*height;
}
现实上,夹杂这两种情势完整没有成绩,办法能够一些界说在接口块(block)内,另外一些界说在接口块外。一种较好的做法是将没有默许完成的办法界说在接口内,而有默许完成的界说在接口外。如许当其别人浏览代码时会很分明地晓得完成一个接口时那些办法必需被完成。固然,编译器会包管一切必须的办法都被完成,以是以上的内容只是一个倡议。
列举类
列举类(或简称为enum),是一组相干的常量。很多言语撑持界说复杂的常量,固然Nice也不破例。很多程序中利用了一些数字常量以暗示特别的寄义。好比一个主动销售机的程序中的一个办法会像上面如许:
letintNICKEL=5;
letintDIME=10;
letintQUARTER=25;
classVendingMachine{
intchange=0;
}
voidaddCoin(VendingMachinemachine,intcents){
machine.change+=cents;
}
但这个办法其实不平安!它能够承受任何数目的零钱,包含一些像3或234320如许的荒唐的数字。一种处置这个成绩的办法是在运转时做反省以确保数据时能够被承受的,并在碰到不成承受的数据时抛出非常。但是,在Nice中有一种更复杂的办理计划:列举。
enumclass-name[(parameter-typeparameter-name,...)]{
option,...
}
列举能够像上面这类复杂的标记:
enumColor{Red,
Orange
,Yellow,Blue,Indigo,Violet}
大概他们能够包括整型(或别的)的值:
enumVendingCoin(intvalue){
nickel(5),dime(10),quarter(25);
}
classVendingMachine{
intchange=0;
}
voidaddCoin(VendingMachinemachine,VendingCoincents){
machine.change+=cents.value;
}
固然,一台真实的主动销售时机保存每种硬币的实践数目,而不单单时它们的总和!
主要缺点就是:速度比较慢,没有C和C++快 |
|