0

Employeeが抽象基本クラスである単純な継承チェーンがあり、この純粋に例示的なコンソール アプリでそれCheckoutを継承するとします。ここで、タイプorManagerのオブジェクトを受け取り、従業員の会社での役職に応じて整数のボーナスを返すメソッドが必要です。私はこれを行うことについていくつかの最初の考えを持っていました.このコンソールアプリがいつかデータ駆動型のWebアプリケーションに成長した場合、各アプローチからの潜在的な長期的な赤字または利益を知りたい.ManagerCheckout

  1. 継承されたクラスに共通のインターフェイスを使用します。私の基本クラスは次のようになります

    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;
    
    
            }
    

    これにインターフェイスを使用したい場合は、すでに実装されているインターフェイスに追いつくのではなく、おそらく昇給に特化した別のインターフェイスを作成する必要があるように思えます(ただし、それは別の日の別の質問です)。

  2. 次のような基本クラスで静的メソッドを使用します

    public static int GiveBonus(Employee e)
            {
                if (e is Manager)
                    return 2000;
                else
                    return 1000;
            }
    
  3. 抽象基本クラスで抽象メソッドを作成し、派生クラスを適切に実装します。

    abstract class Employee
    //fields and constructors
    {
    public abstract int GiveBonusesViaAbstractMethod(Employee e); 
    }
    

これは私には最悪の考えのようです。なぜなら、各派生クラスには、IPrintableまたはEmployeeタイプのパラメーターを受け取るメソッドが必要であり、Manager クラスでは、従業員の Manager かどうかをテストする必要があるからis-aです。

1-2 は、長期的な Web アプリケーションのスケーラビリティと管理性が同じですか? オプション 3 は、私が考え出したほど悪いものですか?

4

4 に答える 4

5

これを行う従来のオブジェクト指向の方法がありません。

abstract class Employee {
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public abstract int GetBonusAmount();
}

class Manager : Employee {
    public override int GetBonusAmount() { return 2000; } 
}

class Checkout : Employee {
    public override int GetBonusAmount() { return 1000; } 
}

Console.WriteLine(someEmployee.GetBonusAmount());
于 2013-06-25T16:20:34.183 に答える
3

あなたは本当にあなた自身の質問にすでに答えていると思います。

私の派生クラスは、呼び出されたコンソールに従業員情報を出力するように設計されたインターフェイスを実装しており、IPrintableそのためのメソッドは 1 つしかありません。このインターフェースはボーナスを与えることとは何の関係もありませんが

[鉱山を強調]

このためのインターフェースはすでに用意されています。と呼ばれていEmployeeます。これを行う慣用的な方法は、抽象クラスに仮想メソッドを実装し、必要に応じてオーバーライドすることです。より慣用的な C# のアプローチは、プロパティを作成してオーバーライドすることです。そのようです:

abstract class Employee {
  public virtual int GetBonus()
  {
    return this.Bonus;
  }

  public virtual int Bonus { get; set; }
}

class Manager : Employee {
  public override int Bonus 
  { 
    get { return 2000; }
  }
}

class Checkout : Employee {
  public override int Bonus
  {
    get { return 1000; }
  }
}
于 2013-06-25T16:20:45.227 に答える
1

両方のサブクラスに GetBonus() メソッドを実装します。「is instance of」チェックを完全に行うことは避けるべきです。

于 2013-06-25T16:22:25.673 に答える