[オブジェクト向けプログラミング入門]継承ではなくアセンブリ
11867 ワード
継承と再利用
機能の再使用の欠点を継承することで
public class Container extends ArrayList<Luggage> {
private int maxSize;
private int currentSize;
public Container(int maxSize){
this.maxSize = maxSize;
}
public void put(Luggate lug) throws NotEnoughSpaceException {
if(!canContain(lug)) throw new NotEnoughSpaceException();
super.add(lug);
currentSize += lug.size();
}
public void extract(Luggage lug){
super.remove(lug);
this.currentSize -= lug.size();
}
public boolean canContain(Luggage lug){
return maxSize >= currentSize + lug.size();
}
}
上記のContainer
クラスはArrayList
を継承し実現した.Container
クラスは、put
およびextract
が上位クラスであるArrayList
およびadd
を用いて実現される.正しい使い方は上図のように、IDEが継承した親のメソッドを推奨として表示するため、開発者は望ましくない操作を誤用する可能性があります.
これは誤って使用した開発者の問題ですか?
Nope. 誤用される可能性のあるクラスを作成するユーザの問題
引き継いだ欠点解決方法→組み立てる
public class FlowController {
private Encryptor encryptor = new Encryptor(); // 필드로 객체를 생성하여 조립
public void process() {
//...
byte[] encrytepdData = encryptor.encrypt(data);
//...
}
}
アセンブリによる機能の再使用
オブジェクトをフィールドとして使用し、ストレージクラスを継承しません.
継承誤用問題の解決
public class Container {
private int maxSize;
private int currentSize;
private List<Luggage> luggages = new ArrayList<>(); // 필드로 사용
public Container(int maxSize){
this.maxSize = maxSize;
}
public void put(Luggate lug) throws NotEnoughSpaceException {
if(!canContain(lug)) throw new NotEnoughSpaceException();
luggages.add(lug);
currentSize += lug.size();
}
public void extract(Luggage lug){
luggages.remove(lug);
this.currentSize -= lug.size();
}
public boolean canContain(Luggage lug){
return maxSize >= currentSize + lug.size();
}
}
前述したように,remove
を継承しなければ,フィールドを用いて実現され,誤用の可能性はなくなる.継承ではなくアセンブリ
継承
Reference
この問題について([オブジェクト向けプログラミング入門]継承ではなくアセンブリ), 我々は、より多くの情報をここで見つけました https://velog.io/@kshired/객체-지향-프로그래밍-입문-상속보단-조립テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol