2013-10-03 78 views
0

我正在努力理解C#interface s。我明白他們允許多重繼承。我試圖編寫一個場景:員工可以查看自己的數據,但不能查看其他數據。如果員工向該經理報告,經理可以查看和編輯員工信息。如何實現一個接口來限制類的獲取和設置屬性

所以我從一個抽象類開始,因爲每個人都是一個用戶,並且度假也是一樣。

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{ } 
    */ 
} 

我應該使用一個接口來定義IEditableIViewable? 我可以做這樣的事嗎?

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? 

我只是不知道如何阻止經理編輯用戶,或如何編寫一個接口這種類型的情況。

回答

0

我不確定我會說接口允許多重繼承(而不是真正的C++形式)。一個接口提供了一個抽象,允許多個實現通過一組預定義的方法/屬性保持一致。

通常這被用作一般的抽象,例如說你想獲得一些數據。您可以創建一個接口來表示返回Stream的方法。然後基於對象的實現,您可以從文件或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! 
     } 
    } 
+0

所以,我怎麼能限制員工的鑄造到IEditable只有誰管理該員工的經理人? – tedski

+0

我不確定你可以使用類系統來做到這一點。誰管理誰是代碼外部的知識。您可以控制隱式/顯式轉換(http://msdn.microsoft.com/zh-cn/library/09479473.aspx),以便您可以查看運行並返回空接口(如果您設置的條件未滿足)。 – Dweeberly