软件构造系列(四)继承与委托

继承

继承是oop语言中的重要一环,用extends关键字实现,在java中所有声明的类都要继承一个类,如果没有特别声明,默认继承object类。被继承的类叫做父类,继承别人的类叫做子类,一个父类可以被多个子类继承,但一个子类不能继承多个父类,但是这里注意,一个接口是可以继承多个接口的,因为接口没有具体的实现,不会发生冲突,子类可以调用父类的变量和方法,注意子类一般是父类的特殊情况:

public class Person{
}
public class zhangsan  extends Person{
}
public class lisi  extends Person{
}

成员变量

子类能否调用父类的成员变量,要看父类成员变量的关键字(例如protect等),具体信息我在软件构造系列(一)里已讲过,如果不清楚请移步。
如果子类中有成员变量的名字与父类中相同,会优先使用子类成员变量(也就是隐藏父类的名字相同的成员变量),这时,如果又想使用父类的这个变量,使用super方法即可。
这里还提醒一点,如果这个类方法的输入参数的名字与此类成员变量重合了,会优先使用方法的输入参数,要使用成员变量得用this方法:

public class Person{
	public int age;
}
public class zhangsan  extends Person{
	public int age;
	public void setage(int age){//这样就把父类和子类的age都set了
		this.age = age;
		super.age = age;
	}
}

方法

与成员变量类似,能否使用父类的方法得看关键字。
方法与父类的方法同名,会优先使用子类方法,覆盖父类方法,相当于override了,这时要使用父类方法,用super就行了

public class Person{
	public void eat(){
	}
}
public class zhangsan  extends Person{
	public void eat(){
	super.eat();
 	}
}

构造器

父类构造器是不能被子类继承的,如果父类的构造器必须要参数,那么子类必须在构造器中使用super(参数)进行构造;如果父类的构造器不需要参数,那就不用管;如果父类的构造器有要参数和不要参数的,如果你不用super构造,默认使用不要参数的构造器构造,否则使用你super对应的构造器。

public class Person{
	public int age;
	public Person(int age){
		this.age = age;
	} 
}
public class zhangsan  extends Person{
	public zhangsan(int age){
		super(age);
	}
}

委托

委托(delegation)说白了就是在一个类里new另一个类,这样就可以到达使用另一个类的属性和方法的效果,来增加代码的复用性和整洁。

实现形式

我总结为两种实现形式
一种直接委托类本身,比如我给一台电脑装个intel的CPU,他就可以利用这个CPU去完成相应的计算:

public class Computer  {
 public Intel intel = new Intel();
}
public class Intel {
}

第二种是委托给接口,其中这种方式更为常用,因为你可以替换接口的具体实现,更加灵活,就比如这里,我给电脑安一个CPU,但我具体安的时候,可以安intel处理器,也可以选择其他牌子的CPU。

public class Computer  {
 public CPU intel = new Intel();
}
public interface CPU {
}
public class Intel extends CPU{
}

临时委托

临时委托一般用在方法中,常用来处理一些操作,因为用完就可扔了,所以是临时的,比如我们要从控制台读入数据时,new一个scanner,就是把读数据这个操作委托给scanner来处理,读完就不需要这个scanner了。

永久委托

永久委托一般用于成员变量,我这个类需要有一个成员,它要有一些属性和功能,那么此时就可以使用委托把这个成员交给另一个类来处理实现,比如上面的电脑的CPU就是永久委托,CPU这个部分委托给CPU相关的类来实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了您的要求,下面是我的回答: 委托构造函数是指在一个构造函数中调用另一个构造函数来完成对象的初始化,从而避免重复编写初始化代码的冗余。在 C++11 标准中,委托构造函数可以用来实现构造函数之间的代码复用,其语法形式是在构造函数的初始化列表中使用名进行初始化;在 C++14 标准中,还允许使用“成员初始化器列表”的形式来初始化数据成员;在 C++17 和 C++20 标准中,则进一步扩展了委托构造函数的应用场景,如支持默认参数、派生构造函数自动继承的所有委托构造函数等。 区别如下: C++11标准中,委托构造函数只能在初始化列表中调用,委托到的构造函数必须在当前中声明且不能包含任何成员初值设定项(即不能有成员初始化器列表),否则会导致编译错误。 C++14标准中,委托构造函数支持成员初始化器列表,因此也可以在成员初始化器列表中调用其他的委托构造函数。 C++17标准中,委托构造函数可以使用默认参数,即可以省略代表默认值的实参,同时,派生构造函数可以自动继承的所有委托构造函数。 C++20标准中,委托构造函数可以在初始化列表中对非直接基进行构造,即可以将委托到的构造函数放在任意位置,并且可以使用 constexpr 构造函数进行委托构造。 希望我的回答对您有帮助,如果还有其它问题,请继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值