在你开始向我射击之前,我不打算这样做,但是另一篇文章中有人说这是可能的.这怎么可能?我从未听说过使用反射继承任何东西.但我看到一些奇怪的事情......
如果没有要覆盖的虚函数,则对子类化密封类没有多大意义.
如果您尝试在其中编写带有虚函数的密封类,则会出现以下编译器错误:
// error CS0549: 'Seal.GetName()' is a new virtual member in sealed class 'Seal'
但是,您可以通过在基类中声明它们来将虚函数转换为密封类(如此),
public abstract class Animal { private readonly string m_name; public virtual string GetName() { return m_name; } public Animal( string name ) { m_name = name; } } public sealed class Seal : Animal { public Seal( string name ) : base(name) {} }
问题仍然存在,我无法看到你如何偷偷通过编译器让你声明一个子类.我尝试使用IronRuby(ruby是所有hackety语言中最黑的)但即使它不会让我.
'密封'部分嵌入到MSIL中,所以我猜测CLR本身实际上是强制执行的.你必须加载代码,解组,删除'密封'位,然后重新组装,并加载新版本.
我很抱歉在另一个帖子中发布了错误的假设,我无法回想起来.使用以下示例,使用Reflection.Emit,显示如何从另一个类派生,但它在运行时失败抛出TypeLoadException.
sealed class Sealed { public int x; public int y; } class Program { static void Main(string[] args) { AppDomain ad = Thread.GetDomain(); AssemblyName an = new AssemblyName(); an.Name = "MyAssembly"; AssemblyBuilder ab = ad.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run); ModuleBuilder mb = ab.DefineDynamicModule("MyModule"); TypeBuilder tb = mb.DefineType("MyType", TypeAttributes.Class, typeof(Sealed)); // Following throws TypeLoadException: Could not load type 'MyType' from // assembly 'MyAssembly' because the parent type is sealed. Type t = tb.CreateType(); } }