主页>技术知识>详情

设计模式之禅中里氏替换原则中有一点困惑

villain/2022-02-24/13阅读 /0评论
设计模式之禅中里氏替换原则中有一点困惑简介: 图中红色方框内的代码 怎么写?解决方法:<pre> <code>class AbstractGun { private AbstractGun gun; public void shoot(){ L

设计模式之禅中里氏替换原则中有一点困惑

 

图中红色方框内的代码 怎么写?


解决方法:
class AbstractGun {
	private AbstractGun gun;
	public void shoot(){
		Log.d("open shoot");
	}

	public void setGun(AbstractGun gun){
		this.gun = gun;
	}

	public void getGun(){
		return this.gun ;
	}
}

class AbstractToy extends AbstractGun{
	private AbstractToyGun gun;
	@Overorde
	public void shoot(){
		parent.gun = this.gun
		Log.d("toy gun shoot");
	}
}

-------------- 记事本写的 不知道有没有错 ,其实就是类覆盖 子类既可以执行父类方法 也可以执行子类自己重载的的方法

 


觉得不是这么写的 如果继承的话 这个UML类图的继承关系不是使用虚线表示的,AbstracyToy和AbstractGun很明显是依赖关系,所以我是这样写的
public abstract class  AbstractToy {

    public AbstractGun abstractGun;

    public void setAbstractGun(AbstractGun abstractGun) {
        this.abstractGun = abstractGun;
    }

     abstract void shoot();
}


class AbstractGun {
    private AbstractGun gun;
    public void shoot(){
        Log.d("open shoot");
    }

    public void setGun(AbstractGun gun){
        this.gun = gun;
    }

    public void getGun(){
        return this.gun ;
    }
}

interface AbstractToy {

}

class ToyGun extends AbstractGun implements AbstractToy{

}

class Rifle extends AbstractGun {
    
}

AbstractToy 定义成接口形式好点


感受完了,在代码层我觉得你的这种方式 更合适,但是玩具Gun这个类锁抽象出来的,理论上应该定义成抽象类,因为接口一般是偏向于 拥有某个功能。而且上述UML类图 表达的意思 AbstractToy 也不会是接口。
本文用户投稿或网站收集转载,如有侵权请联系本站。