如何实现一个接口来限制获取和设置类的属性

时间:2013-10-03 16:55:26

标签: c# interface abstract-class

我正在努力理解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?

我只是不确定如何阻止管理员编辑用户,或者如何为这种情况编写接口。

1 个答案:

答案 0 :(得分:0)

我不确定我会说Interfaces允许多重继承(不是真正的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!
        }
    }