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

本文关键字:获取 属性 设置 何实现 实现 接口 | 更新日期: 2023-09-27 18:33:42

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

我只是不确定如何阻止经理编辑用户,或者如何为这种情况编写界面。

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

我不确定我会说接口允许多重继承(不是真正的C++形式)。 接口提供了一个抽象,允许多个实现通过一组预定义的方法/属性一致地运行。

通常,这被用作一般抽象,例如,假设您想获取一些数据。 您可以创建一个接口,该接口显示返回流的方法。 然后,基于对象的实现,您可以从文件或 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!
        }
    }