c++ protected_合理使用protected关键字,确保类属性的安全性

继承和组合的选择

我们之前学过,继承是隐式的,组合是显示的,其实实际当中组合和继承都可以在新的类里面放他们的子对象。不过区别是,组合中成员对象一般都是private修饰的,但是为了让用户直接访问新类里面组合对象,就需要将组合的成员对象设置为public。

e27c909a10a68d65c2cdbcc6af2c7eda.png

我们来看一个例子:

class E {

public void s(){}

public void r(){}

public void s(){}

}

class W {

public void i(int p){}

}

class WD {

public void ru(){}

public void rd(){}

}

class D {

public WD wd = new WD();

public void op(){}

public void cl(){}

}

public class C{

public E e = new E();

public W[] w = new W[4];

public D

l = new D(),

r = new D();

public C() {

for(int i = 0; i < 4; i++){

w[i] = new W();

}

}

public static void main(String[] args) {

C c = new C();

c.l.w.ru();

c.w.[0].i(60);

}

}

对于继承而已,我们一般可以把它当做公共类来用,也就是说导出类是专用类,基类是通用的公共类,也可以称为通用类。

如何使用protected关键字

6dd1a9bf240fd985adc5d3f22ea4f74f.png

protected关键字的访问权限是介于private和public之间的,比如有时候我们不想让类的用户访问某个成员,但是又想让导出类和同一个包里面的类访问,那么就可以使用protected关键字来实现。但是通常我们不建议用protected关键字来修饰类的成员,一般建议用private关键字来修饰,确保类属性的安全性,但是我们可间接使用protected方法来实现导出类和同一个包类的访问权限。

我们来举个例子看一下:

class V {

private String name ;

protected void set(String n){ name = n;}

public V (String name){ this.name = name}

public String toString(){

return “is ” + name;

}

}

public class C extends V{

private int or;

public C(String name, int or) {

super(name);

this.or = or;

}

public void change(String name,int or) {

set(name);

this.or = or;

}

public String toString(){

return “C ” + or+”: ” +super.toString();

}

public static void main(String[] args) {

C c = new C(“LL”,10);

print(c);

c.change(“B”,20);

print(c);

}

}

/*Output:

C 10: is LL

C 19: is B

通过这个例子我们可以看出,change()方法之所以可以调用方法set(),就是因为方法set()的访问权限是protected。

除此之外,而且我们还可以看出导出类C里面的toString()方法重写了基类的方法。

向上转型

c00e9c5d4b63bbfcbb5cd04e6be87824.png

继承的概念中,导出类可以看作是基类的一种类型。比如现在有一个乐器类I作为基类,还有一个吉他类J作为导出类,我们来看一下用这两个类来书写的例子,我们会理解的更加透彻:

class I {

public void play()

static void r(I i){

i.play();

}

}

public class W extends I {

public static void main(String[] args) {

W w = new W();

I.r(w);

}

}

在这个例子中我们看到,r()方法本应该传递一个I类型的参数,但实际却传递了一个W类型的参数,这很让人费解,但是也没有报错。其实这块进行了一个向上的转化,叫做向上转型,也就是说将W类型转为了I类型,是一个向上的过程。

向上转型是属于安全的转型,但是在转型的过程中,会丢失基类中没有的方法。与向上转型相反的就是向下转型,也就是基类或者叫通用类转为专用类或者叫导出类。

讲到这里,我们都知道,继承和组合都可以复用代码,但是什么时候使用继承,什么时候使用组合,这就需要分析一下,我们需要向上转型不,如果需要向上转型,就要使用继承,如果不需要向上转型,那就最好不要用继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值