C#委托结果:don';我不喜欢公开的方法

C#委托结果:don';我不喜欢公开的方法,c#,delegates,C#,Delegates,我在学C。现在我在摆弄代表和事件。我的问题是关于代理的:似乎我必须保持方法公共虚拟bool是可推荐的(员工e、晋升代理pd)公共的。假设我想保护它。我现在该怎么办?或者这个例子是对委托的错误使用?或者我必须在使用委托时接受公共方法吗?以下是完全可编译的代码: using System; namespace Delegate_Tutorial_1 { public class EmployeeEventArgs : EventArgs { public Empl

我在学C。现在我在摆弄代表和事件。我的问题是关于代理的:似乎我必须保持方法公共虚拟bool是可推荐的(员工e、晋升代理pd)公共的。假设我想保护它。我现在该怎么办?或者这个例子是对委托的错误使用?或者我必须在使用委托时接受公共方法吗?以下是完全可编译的代码:

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);
        }

    }
}
使用系统;
命名空间委托\u教程\u 1
{
公共类EmployeeEventArgs:EventArgs
{
公共雇员雇员{get;set;}
}
//--
公营雇员
{
公共字符串名称{get;set;}
公共服务{get;set;}
公共事件事件处理程序HourlyRateChanged;
私人双小时公寓;
公共双小时利率
{
获取{return hourlyRate;}
设置
{
if(hourlyRate!=值)
{
hourlyRate=值;
OnHourlyRateChanged();
}
}
}
受保护的虚拟void OnHourlyRateChanged()
{
if(HourlyRateChanged!=null)
HourlyRateChanged(this,new-EmployeeEventArgs(){Employee=this});
}
公共虚拟bool可推荐(员工e、晋升代表pd)
{
返回pd(e);
}
}
}
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间委托\u教程\u 1
{
公共代表bool晋升代表(员工emp);
班级计划
{
静态void Main(字符串[]参数)
{
PromotionDelegate PromotionDelegate=PromotionCheck;
List EmployeeList=新列表();
Add(new Employee(){Name=“John”,yearsofsofservice=5,HourlyRate=15});
Add(new Employee(){Name=“Mary”,YearsOfService=4,HourlyRate=17});
foreach(员工名单中的员工emp)
{
emp.HourlyRateChanged+=OnHourlyRateChanged;//订阅员工的事件
if(emp.IsPromotable(emp,PromoteDelegate))
{
emp.HourlyRate*=1.1;
Console.WriteLine(emp.Name+“:可晋升。现在的工资为:“+emp.HourlyRate”);
}
}
Console.ReadLine();
}
//--
公共静态bool晋升检查(员工emp)
{
返回emp.YearsOfService>=5?真:假;
}
HourlyRateChanged上的公共静态无效(对象源,EmployeeEventArgs args)
{
Console.WriteLine(“小时工资已更改为:“+args.Employee.Name”);
}
}
}

事实上,您需要在您的
员工
课程中调用
IsPromotable
,这是它需要公开的原因。这与是否使用代理无关

无论怎样,
公开
它都具有
受保护的所有优点。所有
Employee
类的子类都可以看到
IsPromotable
并覆盖它(因为它也是
虚拟的

现在,给你一些其他的提示

使用
Employee
中的
OnHourlyRateChanged
方法,您应该如下构造代码:

protected virtual void OnHourlyRateChanged()
{
    var hrc = this.HourlyRateChanged;
    if (hrc != null)
    {
        hrc(this, new EmployeeEventArgs() { Employee = this });
    }
}
原因是,在多线程代码中,委托可能在检查之后但在调用之前更改。这种情况并不经常发生,但当它发生时,可能会导致程序抛出异常,从而使调试变得非常困难。您的代码可能不是多线程的,但是您应该习惯使用这种模式


另外,在
程序中
调用了事件处理程序
OnHourlyRateChanged
。通常的约定是对引发事件的方法使用*
上的
命名,但对处理事件的方法不使用。更常见的是,这种方法被称为
Employee\u HourlyRateChanged
。同样,这是一个好习惯,可以避免将来出现歧义。

我不理解这个问题。方法的可访问性(例如,
public
protected
等)与方法是否可用于初始化委托类型实例无关。重写方法时,您必须匹配基类的方法声明,包括可访问性,但这与委托本身没有任何关系(即使概念在效果上类似)。请提供该选项,以再现您实际遇到的任何错误,并提供一个明确的,精确描述代码的作用以及它与您想要的不同之处。在我决定回复您之前,我考虑了很久。如果这很重要的话,你是对的。你说得对,我的问题确实很模糊,我认识到你和《谜》在风格上的不同。你们两人都以各自的方式提供了帮助。之所以含糊不清,是因为我对这个特定代码的体系结构不太熟悉。是的,这是一个学习过程,但我不介意提前思考。这种模糊是我自己不是一个伟大的架构师,无法正确定义问题域的直接后果。我希望这个回答是令人满意的。以上看起来像是一个很好的猜测,关于OP实际上在问什么。让我们希望他们回来解释自己,这样我们就可以确定了。@PeterDuniho-谢谢。我认为这个问题相当清楚。你认为他们可能会问什么?也许我太直截了当了,但我通常会尽量避免用一个不太清楚的问题来猜测。我尊重其他人以不同的方式回答问题,而你也可能有