【问题标题】:C# Java-like inline extension of classes?类的类 C# Java 类内联扩展?
【发布时间】:2011-07-20 23:03:15
【问题描述】:

我会在 Google/MSDN 上查找它,但我不知道它叫什么,所以我在这里问。

在 Java 中,我似乎记得你可以做这样很酷的事情:

Class MyClass
{
  int number;

  MyClass() { }

  void setNumber(int number)
  {
    this.number = number;
  }
}

然后执行以下操作:

MyClass myClass = new MyClass()
  {
    override void setNumber(int Number)
    {
      this.number = 2 * number;
    }
  };

...什么的。请原谅我在上面犯的任何错误——我已经有大约 6 年没有真正接触过 Java 了。

重点是,我记得你可以内联伪扩展类。

现在,我需要扩展一个 C# WinForms 控件,但我只需要使用一次,并且修改非常小。我需要做的就是覆盖CreateParams 属性和OnPaint() 处理程序。

我的解决方案已经变得庞大,到处都是类,包含另一个与标准 .Net 控件基本相同的类似乎很可惜,只是行为略有不同。

是否可以像在 Java 中一样在 C# 中执行此内联扩展?如果是这样,怎么做? (它叫什么,所以我可以在 MSDN 上查找它?)

【问题讨论】:

    标签: c# overriding inline


    【解决方案1】:

    我知道你说C#不能做到这一点,但是可以将它重写为C#,但方法不会太复杂?

    new EffectClause("Sleep Clause", SleepEffect.class)
    {
        public String getClauseDescription()
        {
            return "Bla bla bla";
        }
    
        public boolean isEnabledByDefault()
        {
            return true;
        }
    };
    

    【讨论】:

    • C# 中没有 class-property 但在 JAVA 中。此外:这是一个问题还是一个答案?最后:这与问题有何关系?
    【解决方案2】:

    您在 C# 中寻找的功能称为 Extension Methods。它们是相似的,但您编写的代码如下:

    public static void setNumber(int Number, MyClass target)
    {
        target.number = 2 * number;
    }
    

    您通常将其包含在您自己的扩展命名空间中,然后在必要时使用 MyExtensions 将其纳入范围;当你调用whatever.setNumber(x); 时,C# 能够判断你的意思是调用这个方法;

    我不能 100% 确定这是否会让您覆盖一个类中已经存在的方法。您的另一个选择是从目标类继承一个专门用于覆盖目标方法的类。

    【讨论】:

    • 扩展方法不同,并且提供相同的功能。在上面,想象一下:T one = new T { public void () { IMPL1(); } }; T two = new T { public void () { IMPL2(); } };——也就是说,扩展方法可以装饰一个静态已知的类型,但不能允许创建不同的匿名子类型。
    • 也许他对“扩展”的使用让你感到困惑。他不是在谈论 C# 扩展方法,而是在扩展(在 Java 意义上)一个类。或者换句话说,继承自内联类。
    • 不是操作要求的。扩展方法不允许您覆盖现有方法或属性。
    • 是的,我在您提供的 sn-p 中看到了您在做什么,但我看不出它如何使我能够在外国课程中覆盖 OnPaint() 之类的东西。无论如何谢谢:)
    【解决方案3】:

    这(显式主格匿名类型)在 C#3/4 中是不可能的。

    类型必须显式创建然后构造。任务有时在 C# 中通过使用事件和委托(类调用提供诸如“NeedDataSource”之类的实现的事件)“反转”——可以说是因为这个,尽管它在许多情况下才有意义。

    如果可以创建显式的非主格类型:var x = new { P = 1, };,但只能在本地范围内。隐式方法包括委托/lambdas/匿名函数,此处不适用。

    编码愉快。

    【讨论】:

    • 谢谢。这回答了我的问题,但这不是我希望的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多