我正在学习C#。现在,我正在摆弄代表和活动。我的问题是关于代表:似乎我必须保持方法 public virtual bool IsPromotable(Employee e,PromotionDelegate pd) public。假设我希望它受到保护。现在我该怎么做?或者这个例子对委托的使用不好?或者我必须在使用委托时简单地接受公共方法?以下是完全可编辑的代码:
using System;
namespace Delegate_Tutorial_1
{
public class EmployeeEventArgs : EventArgs
{
public Employee Employee { get; set; }
}
//--
public class Employee
{
public string Name { get; set; }
public int YearsOfService { get; set; }
public event EventHandler<EmployeeEventArgs> HourlyRateChanged;
private double hourlyRate;
public double HourlyRate
{
get { return hourlyRate; }
set
{
if (hourlyRate != value)
{
hourlyRate = value;
OnHourlyRateChanged();
}
}
}
protected virtual void OnHourlyRateChanged()
{
if (HourlyRateChanged != null)
HourlyRateChanged(this, new EmployeeEventArgs() { Employee = this});
}
public virtual bool IsPromotable(Employee e, PromotionDelegate pd)
{
return pd(e);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_Tutorial_1
{
public delegate bool PromotionDelegate(Employee emp);
class Program
{
static void Main(string[] args)
{
PromotionDelegate promoDelegate = PromotionCheck;
List<Employee> EmployeeList = new List<Employee>();
EmployeeList.Add(new Employee() { Name = "John", YearsOfService = 5, HourlyRate = 15 });
EmployeeList.Add(new Employee() { Name = "Mary", YearsOfService = 4, HourlyRate = 17 });
foreach (Employee emp in EmployeeList)
{
emp.HourlyRateChanged += OnHourlyRateChanged; //Subscribe to the event of the Employee
if (emp.IsPromotable(emp, promoDelegate))
{
emp.HourlyRate *= 1.1;
Console.WriteLine(emp.Name + " : eligable for promotion. Salary now is: " + emp.HourlyRate);
}
}
Console.ReadLine();
}
//--
public static bool PromotionCheck(Employee emp)
{
return emp.YearsOfService >= 5 ? true : false;
}
public static void OnHourlyRateChanged(object source, EmployeeEventArgs args)
{
Console.WriteLine("Hourly salary has been changed for: " + args.Employee.Name);
}
}
}
答案 0 :(得分:0)
您需要在班级IsPromotable
的{{1}}课程上致电Employee
,这是因为它需要Program
。它与您是否使用代表无关。
成为public
它具有public
的所有优点。所有protected
类后代都可以看到Employee
并覆盖它(因为它也是IsPromotable
)。
现在,还有其他一些提示。
使用virtual
OnHourlyRateChanged
方法,您应该构建如下代码:
Employee
原因是在多线程代码中,委托可能会在检查之后但在通话之前发生变化。它不会经常发生,但是当它发生时它会导致程序抛出异常并且调试变得非常困难。您的代码可能不是多线程的,但您应该始终将此模式用作习惯。
此外,在protected virtual void OnHourlyRateChanged()
{
var hrc = this.HourlyRateChanged;
if (hrc != null)
{
hrc(this, new EmployeeEventArgs() { Employee = this });
}
}
中,您已调用事件处理程序Program
。通常的约定是对引发事件的方法使用OnHourlyRateChanged
命名,但不对处理事件的方法使用On*
命名。这种方法被称为Employee_HourlyRateChanged
更为常见。再次,这是一个很好的习惯,以避免将来模棱两可。