小编Ste*_*veT的帖子

如何避免破坏Liskov替换原则(LSP)?

我的情况与Steve Complete所提到的Steve McConnell非常相似.只有我的问题是基于车辆和三轮车才恰好依据法律属于汽车类别.到目前为止,汽车有四个轮子.无论如何,我的域名都不必要地复杂,所以很容易坚持使用下面的猫.

怀疑覆盖例程的类并在派生例程中不执行任何操作这通常表示基类设计中的错误.例如,假设您有一个类Cat和一个例程Scratch(),并假设您最终发现某些猫被声明并且无法划伤.您可能想要创建一个派生自名为ScratchlessCat的Cat的类,并覆盖Scratch()例程以不执行任何操作.这种方法存在几个问题:

它通过改变其接口的语义来违反Cat类中提供的抽象(接口契约).

当您将其扩展到其他派生类时,此方法很快就会失控.当你找到一只没有尾巴的猫时会发生什么?还是一只没有抓到老鼠的猫?还是一只不喝牛奶的猫?最终你会得到像ScratchlessTaillessMicelessMilklessCat这样的派生类.

随着时间的推移,这种方法会导致代码难以维护,因为祖先类的接口和行为对其后代的行为意味着很少或根本没有.

解决此问题的地方不在基类中,而是在原始Cat类中.创建一个Claws类并在Cats类中包含它.根本问题是假设所有猫都抓了,所以在源头修复这个问题,而不是仅仅在目的地包扎它.

根据他上面的伟大着作中的文字.以下是坏事

父类不必是抽象的

public abstract class Cat {
   public void scratch() {
      System.out.println("I can scratch");
   }
}
Run Code Online (Sandbox Code Playgroud)

派生类

public class ScratchlessCat extends Cat {
   @Override
   public void scratch() {
      // do nothing
   }
}
Run Code Online (Sandbox Code Playgroud)

现在他建议创建另一个类Claws,但我不明白如何使用这个类来避免需要ScratchlessCat#Scratch.

java oop liskov-substitution-principle

15
推荐指数
2
解决办法
2773
查看次数

我可以强制 Jquery Dirtyform 将表单视为脏表单吗?

我们使用 JQuery dirtyform 插件在用户更改表单数据并尝试离开页面时向用户显示警告,并且效果良好。

我想做的另一件事是在页面首次加载时强制表单变脏。我不知道如何做到这一点 - 我尝试使用 javascript 更改表单字段上的值,我尝试将“已更改”类添加到表单字段,但是当我导航时,这些都不会触发警告对话框远离页面。

有没有办法做到这一点?

回答:

$(document).ready(function() {
   $("form").dirty_form({includeHidden: true});
   $("a").dirty_stopper();

   $("#dummy").val("1");
   $("#dummy").blur();
});
Run Code Online (Sandbox Code Playgroud)

并在html中:

<input type="hidden" name="dummy" id="dummy" value="0" />
Run Code Online (Sandbox Code Playgroud)

forms jquery

3
推荐指数
1
解决办法
4397
查看次数

标签 统计

forms ×1

java ×1

jquery ×1

liskov-substitution-principle ×1

oop ×1