デザインテクニックを継承


デザインのテクニックを継承
次は、設計継承関係に関するいくつかの提案です.
1、共有メンバーをスーパークラスに配置する
ここでのメンバーには、メンバー変数とメンバーメソッドが含まれます.これにより、コードの重複記述を減らし、エラーを回避することができる(コードが多ければ多いほど、エラーが発生しやすい).パッケージ性も向上し、プログラムがより丈夫になります.
2、保護された変数(protectedによって修飾される)はなるべく使用しない
多くの人は、ほとんどのインスタンス変数をprotectedと定義するのが良いと考えています.そうすれば、サブクラスは必要なときに直接アクセスすることができます.しかし,protected修飾を用いるとより良い保護作用が得られないのは,第一に,サブクラスがfinalと宣言されなければ,他のプログラマーがサブクラスを下に派生させることができ,そのクラスのprotectedのメンバーに直接アクセスできるため,いわゆるパッケージ性が破壊されるからである.第二に、protected修飾のメンバーは、同じパケット内のすべてのクラスにアクセスすることができ、このクラスのサブクラスであるかどうかにかかわらず、データに一定の危険をもたらす.
3、継承を使用して字親関係を実現する
継承を使用すると多くのコードを節約できますが、勝手に使用されないようにします.例えば、パートタイマーは同じ名前と年齢を持っていますが、彼らは会社の従業員とは違って、いわゆる給料はありません.彼らは時間で労働報酬を得ているからです.従業員のような給料待遇はありません.したがって、Employeeクラス(マネージャサブクラスが1つあると仮定)でサブクラスContratorが派生した場合、Employeeでの給与計算のような印刷方法は、時間労働に適していないため、明らかに不合理である.したがって、2つのクラスの間に子の親の関係があるかどうかを明らかにし、継承を使用します.
4、継承の方法を使うことに意味があります.そうしないと、継承関係を使用しないでください.
互いに変換できる2つの物事に対して、継承を使うのはよくありません.例えば、休日も1日ですが、休日を1週間や1ヶ月の子として考えることができますが、休日は非休日に変えることができるので、あまり適切ではありません.
5、オーバーライド方法の場合、予想される行為を変更しない
一つの方法を上書きする場合、行為の内包を勝手に変えるべきではなく、超クラスの方法がサブクラスの応用に適していないか、欠陥がある場合に、この方法を上書きするべきである.上書きされたメソッドに意味があるかどうかを自分で慎重に考えなければ、コンパイラはそのメソッドに意味があるかどうか分かりません.文法に間違いがなければ、コンパイルすることができます.
6.タイプ情報ではなく、マルチステートの使用
次のコードについて:
if(x is of type1)
        action1(x);
else if(x is of type2)
        action2(x);

これは多態の使用を考慮する必要がある.
場合
action1
および
action2
同じ内容を表すと、2つのクラスのスーパークラスまたはインタフェースに配置するメソッドを定義し、直接呼び出すことができます.
x.action()
ということで、
JVM
VMは動的にバインド可能
x
そのタイプに属し、多くのコードを節約し、実行効率を向上させ、コードのメンテナンスと拡張に有利です.
次に例を示します.
class Employee
{
        //      private
        private String name;
        private double salary;
        public Employee(String name,double salary){
                this.name = name;
                this.salary = salary;
        }
        public String getName(){
                return name;
        }
        public double getSalary(){
                return salary;
        }
        public void setSalary(double salary){
                this.salary = salary;
        }
}
class Manager extends Employee{
        private double bonus = 0;
        public Manager(String name,double salary){
                //    Employee     
                super(name,salary);
        }
        //  Manager     salary,      
        public double getSalary(){
                double baseSalary = super.getSalary();
                return baseSalary + bonus;
        }
        public void setBonus(double bonus){
                this.bonus = bonus;
        }
}
class ManagerText{
        public static void main(String [] args){
                Manager boss = new Manager("Anna",80000);
                boss.setBonus(5000);
                Employee[] staff = new Employee[3];
                staff[0] = boss;//  boss Manager  , Employee   ,  ,      staff       
                staff[1] = new Employee("Ben",50000);
                staff[2] = new Employee("Jone",40000);
                for(int i=0;i<staff.length;i++){
                        System.out.println("name = " + staff[i].getName() + ",salary = " + staff[i].getSalary());
                }
        }
}

7
反射をあまり使わない
反射メカニズムにより、変数と方法を表示することで、より汎用的なプログラムを作成することができます.この機能は携帯システムプログラムにとって極めて実用的であるが、通常はアプリケーションの作成には適用されない.反射は脆弱です.つまり、コンパイラはプログラムのエラーを発見するのに役立ちません.エラーは実行時にのみ検出され、例外が発生します.