在你开始向我射击之前,我不打算这样做,但是另一篇文章中有人说这是可能的.这怎么可能?我从未听说过使用反射继承任何东西.但我看到一些奇怪的事情......
Ori*_*rds 15
如果没有要覆盖的虚函数,则对子类化密封类没有多大意义.
如果您尝试在其中编写带有虚函数的密封类,则会出现以下编译器错误:
// error CS0549: 'Seal.GetName()' is a new virtual member in sealed class 'Seal'
Run Code Online (Sandbox Code Playgroud)
但是,您可以通过在基类中声明它们来将虚函数转换为密封类(如此),
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) {}
}
Run Code Online (Sandbox Code Playgroud)
问题仍然存在,我无法看到你如何偷偷通过编译器让你声明一个子类.我尝试使用IronRuby(ruby是所有hackety语言中最黑的)但即使它不会让我.
'密封'部分嵌入到MSIL中,所以我猜测CLR本身实际上是强制执行的.你必须加载代码,解组,删除'密封'位,然后重新组装,并加载新版本.
dal*_*lle 11
我很抱歉在另一个帖子中发布了错误的假设,我无法回想起来.使用以下示例,使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19824 次 |
| 最近记录: |