当前位置:  开发笔记 > 编程语言 > 正文

C#:在不定义新类的情况下创建抽象类的实例

如何解决《C#:在不定义新类的情况下创建抽象类的实例》经验,为你挑选了4个好方法。

我知道它可以用Java完成,因为我过去曾广泛使用过这种技术.Java中的一个例子如下所示.(附加问题.这种技术被称为什么?如果没有名称,很难找到这样的例子.)

public abstract class Example {
   public abstract void doStuff();
}

public class StartHere{
   public static void main(string[] args){
      Example x = new Example(){
         public void doStuff(){
            System.out.println("Did stuff");
         }            
      };
      x.doStuff();
   }
}

现在,我的主要问题是,这也可以在C#中完成,如果是这样,怎么样?



1> Anton Gogole..:

Java技术被称为" 匿名内部类 ",在C#中没有等价物.



2> Darrel Mille..:

使用lamba表达式和类初始值设定项,您可以通过一些努力获得相同的行为.

public class Example {
    public Action DoStuff;
    public Action DoStuffWithParameter;
    public Func DoStuffWithReturnValue;
}

class Program {
    static void Main(string[] args) {
        var x = new Example() {
            DoStuff = () => {
                Console.WriteLine("Did Stuff");
            },
            DoStuffWithParameter = (p) => {
                Console.WriteLine("Did Stuff with parameter " + p);
            },
            DoStuffWithReturnValue = () => { return 99; }


        };

        x.DoStuff();
        x.DoStuffWithParameter(10);
        int value = x.DoStuffWithReturnValue();
        Console.WriteLine("Return value " + value);
        Console.ReadLine();
    }
}

我刚刚意识到这个解决方案的一个问题是如果你要在Example类中创建字段,lambda表达式将无法访问这些字段.

但是,没有理由不能将示例实例传递给lambda表达式,这将使它们可以访问示例可能包含的任何公共状态.AFAIK在功能上等同于Java匿名内部类.

PS如果你要投票给答案,请帮我们一个忙,并添加评论,说明你不同意的原因:-)


这不是**相同的行为.匿名内部类最有用的部分是能够快速扩展类而无需定义整个新类型.

3> Michael Mead..:

通常,使用.Net中的委托以更清晰的方式解决使用Java中的匿名内部类解决的问题.您的示例有点过于简单,无法确定您的意图.如果你使用抽象类的意图是传递一个"行为",那就考虑只使用一个Action委托.

public class StartHere{
   public static void main(string[] args){
      Action doStuff = () => Console.WriteLine("Did stuff");
      executeSomething(doStuff);
   }

   public static void executeSomething(Action action)
   {
      action();
   }
}



4> Marc Gravell..:

这不能在C#中完成; 你需要声明一个新的类类型.你在C#中最接近的可能是一个命名的嵌套类:

public class StartHere{
    private class Foo : Example {
        public override void  doStuff()
        {
            Console.WriteLine("did stuff");
        }
    }
   public static void Main(string[] args){
      Example x = new Foo();
      x.doStuff();
   }
}

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有