【问题标题】:C# : Inheritance @ DelegatesC#:继承@委托
【发布时间】:2009-11-18 07:55:25
【问题描述】:

假设我有代码段

namespace Test
{
    public delegate void StaticticsDelegate(object sender,EventArgs e);

    class DynamicDelegates
    {

        static void Main()
        {
            StaticticsDelegate del = BowlerStatistics;
            BallThrownEventArgs be = new BallThrownEventArgs(90, 145);
            del(DynamicDelegates.Main,be);

            del = BatsmanStatistics;
            RunsScoredEventArgs re = new RunsScoredEventArgs("Skeet", 55);
            del(DynamicDelegates.Main, re);
            Console.ReadLine();
        }


        static void BowlerStatistics(object sender, BallThrownEventArgs e)
        {
         Console.WriteLine
         ("{0} sender is ; Bowler Statistics :speed {1} angle {2}",
          sender, e.Speed, e.Angle);
        }

        static void BatsmanStatistics(object sender, RunsScoredEventArgs e)
        {
            Console.WriteLine
            ("{0} sender is ; Batsman Statistics :name {1} runs {2}",
            sender, e.PlayerName, e.Runs);
        }

    }

    class BallThrownEventArgs:EventArgs
    {
        int angle;
        int speed;
        public BallThrownEventArgs(int angle, int speed)
        {
            this.angle = angle;
            this.speed = speed;
        }

        public int Angle
        {
            get { return angle; }
        }

        public int Speed
        {
            get { return speed; }
        }

    }

    class RunsScoredEventArgs : EventArgs
    {
        string playerName;
        int runs;
        public RunsScoredEventArgs(string playerName, int runs)
        {
            this.playerName = playerName;
            this.runs = runs;
        }

        public string PlayerName
        {
            get { return playerName; }
        }

        public int Runs
        {
            get { return runs; }
        }
    }

 }

1) 既然“BallThrownEventArgs”和“RunsScoredEventsArgs”是从“EventArgs”派生的,为什么 是否生成了错误“匹配没有重载...” 当我执行“Main()”时。

2)你所说的“ContraVariance”和“Covariance”是什么意思(请举个例子来理解)?

3) 术语“逆变”和“协变”仅与委托有关?

【问题讨论】:

  • 协/逆变相关问题:stackoverflow.com/questions/1120688/…>

标签: c# delegates


【解决方案1】:

问题是您试图以错误的方式使用方差。

方差的想法是,如果您的方法不需要像委托所说的那样提供具体信息,并且如果您的方法返回的具体信息比委托必须返回的更多,那么您可以使用该方法构建委托。

在你的情况下,情况正好相反:

public delegate void StatisticsDelegate(object sender, EventArgs e);

static void BowlerStatistics(object sender, BallThrownEventArgs e)

BowlerStatistics 必须被赋予一个BallThrownEventArgs,但StatisticsDelegate 只保证它会提供一个EventArgs

假设您可以从BowlerStatistics 创建一个StatisticsDelegate:您希望以下代码做什么?

StaticticsDelegate del = BowlerStatistics;
del(null, new EventArgs());

BowlerStatistics 没有任何与球相关的信息可供使用。

或者使用您现有的代码,但稍微移动一下:

    StaticticsDelegate del = BowlerStatistics; // *
    RunsScoredEventArgs re = new RunsScoredEventArgs("Skeet", 55);
    del(DynamicDelegates.Main, re);

    del = BatsmanStatistics; // *
    BallThrownEventArgs be = new BallThrownEventArgs(90, 145);
    del(DynamicDelegates.Main,be);
    Console.ReadLine();

这次您要让投球手统计数据代表处理击球手的统计数据,反之亦然!唯一可能无法编译的行是方法组转换行(上面标有// *)-因此为了实现类型安全,它们编译。

协变和逆变是棘手的话题 - 您可能会发现 Eric Lippert's series of blog posts 很有用。在 C# 4 之前,差异仅适用于创建委托;从 C# 4 开始,还有接口和委托通用变量,允许您编写:

// Covariance
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;

// Contravariance
Comparer<Shape> areaSorter = (s1, s2) => s1.Area.CompareTo(s2.Area);
Comparer<Triangle> triangleAreaSorter = areaSorter;

【讨论】:

    【解决方案2】:

    只是想在这里提供帮助,您是否观看过 Eric Lippert 的视频,他在视频中解释了逆变和协方差的一些代码。这是两个视频的链接,http://msdn.microsoft.com/en-us/vcsharp/ee672314.aspxhttp://msdn.microsoft.com/en-us/vcsharp/ee672319.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2011-07-12
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多