0

C# の理解に苦労していinterfaceます。多重継承が許可されていることを理解しています。シナリオのコーディングを試みています。従業員は自分のデータを表示できますが、他のデータは表示できません。従業員がそのマネージャーに報告する場合、マネージャーは従業員情報を表示および編集できます。

誰もがユーザーであり、同じように休暇を取るので、抽象クラスから始めます。

public abstract class User {
    string _id;
    string _firstName;
    string _lastName;
    double _salaryAmount;
    double _bonusAmount;
    int _vacationBalance;

    public void TakeVacation(int hours) {
        _vacationBalance -= hours;
    }

    //do I implement this here?
    /*
    public int SalaryAmount{ }
    */
}

と を定義するためにインターフェイスを使用する必要がIEditableありIViewableますか? 私はこのようなことをすることができますか?

public interface IEditable {

    double SalaryAmount { get; set; }

}

public class Employee : User, IEditable {

    public double SalaryAmount {
        get {
            return base._salaryAmount;
        }
        set {
            base._salaryAmount = value;
        }
    }
}

//Will I need a ReadOnlyEmployee or something?

マネージャーがユーザーを編集するのをブロックする方法や、このような状況でのインターフェイスを作成する方法がわかりません。

4

1 に答える 1

0

インターフェイスが多重継承を許可しているとは言えません (真の C++ 形式ではありません)。インターフェースは、定義済みの一連のメソッド/プロパティを介して複数の実装が一貫して動作できるようにする抽象化を提供します。

多くの場合、これは一般的な抽象化として使用されます。たとえば、データを取得したいとします。Stream を返すメソッドを表示する Interface を作成できます。次に、オブジェクトの実装に基づいて、ファイル、websocket、またはパイプなどからストリームを返すことができます。インターフェースの消費者は、ストリームがどこから来ているかを認識/気にする必要はありません。

あなたの例では、User クラスで何もする必要はありません。これは、IEditable インターフェイスを実装していないためです。Employee クラスだけが実装しています。

これがあなたが探していると私が思うものです。これは、明示的なインターフェイス構文 (IEditable.Name) を使用します。基本メソッド名とインターフェイス名は同じですが、動作が異なる必要があるためです。

public abstract class User {
    public String Id { get; protected set; }
    public String FirstName { get; protected set; }
    public String LastName { get; protected set; }
    // ...
    public Double SalaryAmount { get; protected set; }
    // ...
    public Int32 VacationBalance { get; protected set; }

    public void TakeVacation(int hours) {
        VacationBalance -= hours;
        }
    }

public interface IEditable {
    Double SalaryAmount { get; set; }
    }

public class Employee: User, IEditable {
    #region IEditable Members
    double IEditable.SalaryAmount {
        get { return base.SalaryAmount; }
        set { base.SalaryAmount = value; }
        }
    #endregion
    }


class Program {
    static void Main(string[] args) {
        var emp = new Employee();
        emp.SalaryAmount = 3; // ERROR!
        ((IEditable) emp).SalaryAmount = 3; // GOOD!
        }
    }
于 2013-10-03T17:26:04.033 に答える