Employee
が抽象基本クラスである単純な継承チェーンがあり、この純粋に例示的なコンソール アプリでそれCheckout
を継承するとします。ここで、タイプorManager
のオブジェクトを受け取り、従業員の会社での役職に応じて整数のボーナスを返すメソッドが必要です。私はこれを行うことについていくつかの最初の考えを持っていました.このコンソールアプリがいつかデータ駆動型のWebアプリケーションに成長した場合、各アプローチからの潜在的な長期的な赤字または利益を知りたい.Manager
Checkout
継承されたクラスに共通のインターフェイスを使用します。私の基本クラスは次のようになります
abstract class Employee { public int EmployeeId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
私の派生クラスは、呼び出されたコンソールに従業員情報を出力するように設計されたインターフェイスを実装しており、
IPrintable
そのためのメソッドは 1 つしかありません。このインターフェースはボーナスを与えることとは何の関係もありませんが、私はMain
メソッドが生きているクラスで以下をモックアップし、プログラムは正常に動作しました。static int GiveBonusesViaInterface(IPrintable i) { if (i is Checkout) return 1000; else return 2000; }
これにインターフェイスを使用したい場合は、すでに実装されているインターフェイスに追いつくのではなく、おそらく昇給に特化した別のインターフェイスを作成する必要があるように思えます(ただし、それは別の日の別の質問です)。
次のような基本クラスで静的メソッドを使用します
public static int GiveBonus(Employee e) { if (e is Manager) return 2000; else return 1000; }
抽象基本クラスで抽象メソッドを作成し、派生クラスを適切に実装します。
abstract class Employee //fields and constructors { public abstract int GiveBonusesViaAbstractMethod(Employee e); }
これは私には最悪の考えのようです。なぜなら、各派生クラスには、IPrintable
またはEmployee
タイプのパラメーターを受け取るメソッドが必要であり、Manager クラスでは、従業員の Manager かどうかをテストする必要があるからis-a
です。
1-2 は、長期的な Web アプリケーションのスケーラビリティと管理性が同じですか? オプション 3 は、私が考え出したほど悪いものですか?