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

我应该使用接口来定义IEditableandIViewable吗?我可以做这样的事情吗?

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 的方法。然后基于对象的实现,您可以从文件或 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 回答