Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类的C#类Java内联扩展?_C#_Overriding_Inline - Fatal编程技术网

类的C#类Java内联扩展?

类的C#类Java内联扩展?,c#,overriding,inline,C#,Overriding,Inline,我会在Google/MSDN上查这个,但我不知道它叫什么,所以我在这里问 在Java中,我似乎记得您可以做一些非常酷的事情,比如: Class MyClass { int number; MyClass() { } void setNumber(int number) { this.number = number; } } MyClass myClass = new MyClass() { override void setNumber(int Nu

我会在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;
    }
  };
然后做一些类似的事情:

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#3/4中是不可能的

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

如果可以创建显式非指定类型:
varx=new{p=1,}但仅在本地范围内。隐式方法包括委托/lambdas/匿名函数,不适用于此处


愉快的编码。

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

public static void setNumber(int Number, MyClass target)
{
    target.number = 2 * number;
}
您通常将其包含在自己的扩展名称空间中,然后在必要时使用MyExtensions将其纳入范围;C#能够理解,当您调用which.setNumber(x)时,您的意思是调用这个方法


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

我知道您说过这不能在C#中完成,但可以将其重写为C#,但方法不太复杂

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

    public boolean isEnabledByDefault()
    {
        return true;
    }
};

扩展方法不同,并且不提供相同的功能。在上面,想象:
tone=newt{public void(){IMPL1();};two=新的T{public void(){IMPL2();}--也就是说,扩展方法可以修饰静态已知的类型,但不能允许创建不同的匿名子类型。也许他对“扩展”的使用让你感到困惑。他说的不是C#扩展方法,而是(在Java意义上)扩展类。或者换句话说,从类内联继承。而不是op所要求的。扩展方法不允许您重写现有的方法或属性。是的,我在您提供的代码段中看到了您在做什么,但我看不到它如何使我能够重写外部类中类似于
OnPaint()
的内容。无论如何谢谢:)谢谢。这回答了我的问题,但这不是我所希望的答案。C语言中没有
-属性,而JAVA语言中没有。此外:这是一个问题还是一个答案?最后一点:这与问题有什么关系?