我正在努力理解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{ }
*/
}
我应该使用界面来定义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?
我只是不确定如何阻止管理员编辑用户,或者如何为这种情况编写接口。
答案 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!
}
}