【问题标题】:How can I do partial class without using partial keyword? [closed]如何在不使用 partial 关键字的情况下进行部分类? [关闭]
【发布时间】:2014-07-09 14:32:58
【问题描述】:

我在一次采访中被问到这个问题。如何重复此关键字的功能? (С#.NET)

编辑 1:是的,我认为这是一个不好的问题,但有趣的是知道这会回答你们

编辑2:谢谢大家的回答,我明白了!

【问题讨论】:

  • 他们想不出更好的问题?
  • 使用基类不会“重复”部分类的功能。有些事情你可以用部分类做,而你只能用部分类做。
  • 你不能重复这个功能,但是你可以通过继承和封装来做类似的事情。
  • 是的,你可以做类似的事情,但如果被问到如何做partial classes,那就不一样了。目前的问题需要澄清(或在面试期间需要)他们需要哪些部分类的功能才能被接受。也许才是真正的答案,“你是什么意思,你需要什么功能?”
  • 这个问题似乎跑题了,因为这个问题的正确答案只能由进行采访的人提供,其他一切都是猜测。

标签: c# .net class partial partial-classes


【解决方案1】:

我认为 - 使用扩展

public class MyClass
{
    public Method1()
    {
    }
}

public static class MyClassExt
{
    public static Method2(this MyClass myClass)
    {
    }
}

MyClass mc = new MyClass();
mc.Method1();
mc.Method2();

【讨论】:

  • 而且你不能访问私有方法,也不能添加ctor、属性、字段、静态方法、私有方法、虚拟...
  • 对于某些观察到的功能,这可能看起来相似,但这绝对不能复制部分类是什么。
  • 但是使用扩展,您无法访问某些字段...
  • 是的,它不是完整的功能。
【解决方案2】:

编写一个小脚本,在编译之前“连接”不同的文件。

这样的脚本可能看起来像:

#!/bin/bash
grep -P $2 "using .*" > $3
tac $1 | sed '0,/}/{s/}//}' | tac >> $3
grep -v -P ".*class.* {" < $2 >> $3

然后用script File1.cs File2.cs ResultingFile.cs 调用它(如果你想支持命名空间,应该使用更高级的技术)。对于大多数 IDE,您可以指定应在编译前执行的脚本。


另一种可能的方法是使用子类化。假设你有一个部分类Foo

文件1

public partial class Foo {

    //methods part 1

}

文件2

public partial class Foo {

    //methods part 2

}

收件人:

public abstract class FooBase {

    //methods part 1

}

和:

public class RealFoo : FooBase {

    //methods part 2

}

然后应该公开所有字段,并且您应该为第 2 部分的方法定义抽象签名,以便您可以调用它们。

【讨论】:

  • @CommuSoft 这个脚本是什么语言的?
  • 正如你在第一行看到的:bash(或/bin/bash,Linux 的shebang)
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2015-05-24
  • 1970-01-01
  • 2016-02-20
相关资源
最近更新 更多