.Net框架中的大量类被标记为"已密封",从而阻止您使用自己的类继承这些类.当然,这违背了面向对象的本质,您可以在其中扩展和重新定义现有对象的行为.
是否有充分的理由存在'sealed'关键字?
例如,Silverlight中的NotifyCollectionChangedEventArgs是密封的.我想创建自己的ObservableCollection版本,它支持AddRange和RemoveRange,但NCCEA的Silverlight版本不提供支持NewItems和OldItems属性的多个项目的构造函数,这些项目已经被定义为IList.通常,我只是用我自己的变体扩展了类,它覆盖了NewItems和OldItems属性,但是在这种情况下我不能,而且我看不出为什么会出现这种情况.
可能重复:
在C#中Java的最终结果是什么?
在Java中,final不仅适用于一个类.
所以,我想知道:两个关键字之间是否有任何功能差异?
谢谢你,对不起相对noob问题感到抱歉.
快速的Google搜索无法满足我的需求.
在MSDN C#编程指南中,提到:
"A类成员,方法,字段,属性或事件,在被覆盖的基类的虚拟构件可以声明构件作为密封的派生类".
我理解上面的方法,属性和事件的声明,但上面的语句如何对类的字段有效?我在一个程序中尝试了这个并验证了一个字段不能是虚拟的,因此不能被覆盖.那怎么能被密封呢?如果它不能,那么来自MSDN参考的上述声明是否应该省略提及字段?
谢谢.
可以sealed在Scala中定义类,基本上final除非子类在同一文件中发生.
似乎JVM不允许final类字节码及其子类.
考虑到字节码中没有源文件的"概念",如何强制执行此限制?
因此,如何javac防止Scala sealed类在Java中被分类?
我正在研究一个安全性很大的项目.要求是密封我们的罐子.
由于我们密封了罐子,我们的很多junit测试失败了,出现以下错误:
java.lang.SecurityException: sealing violation: package [a.dependency.package] is sealed
at java.net.URLClassLoader.defineClass(URLClassLoader.java:234)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.mockito.cglib.core.ReflectUtils.addAllMethods(ReflectUtils.java:349)
at org.mockito.cglib.proxy.Enhancer.getMethods(Enhancer.java:422)
at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:457)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:93)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:50)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:54)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:45)
at org.mockito.Mockito.spy(Mockito.java:991)
at [...]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) …Run Code Online (Sandbox Code Playgroud) 我有以下课程:
namespace Warnings
{
public abstract class BaseWarningIntField : IWarningInnerDataField
{
public string PropName;
public string HeaderCaption;
public sealed WarningInnerDataType DataType
{
get { return WarningInnerDataType.Integer; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望最后一个属性DataType不可覆盖,因为它是Integer类型的warning-detail字段的基类,所以它需要始终返回正确的类型WarningInnerDataType.Integer.
无论如何,编译器给我以下错误:
'Warnings.BaseWarningIntField.DataType'无法密封,因为它不是覆盖
但是,据我所知,override这与我想要实现的完全相反.
我已经看到你可以使用反射来操纵私人和内部成员.我也看到它说'密封'类更安全,而不是.
修饰语"公开,受保护,内部,私有,抽象,密封,只读"只不过是绅士对设计和API使用的一致意见,只要您能够获得反思,就可以打破它们吗?如果黑客已经在运行调用你的API的代码,游戏就已经丢失了,对吗?
以下是否比任何其他类更安全?
//private class
sealed class User
{
private string _secret = "shazam";
public readonly decimal YourSalary;
public string YourOffice{get;};
private DoPrivilegedAction()
{
}
}
Run Code Online (Sandbox Code Playgroud) 如果我使用了文档中的示例,
class SomeActivity : AppCompatActivity() {
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
Run Code Online (Sandbox Code Playgroud)
它没有编译,错误:
Cannot access '<init>', it is private in 'Expr'.
Run Code Online (Sandbox Code Playgroud)
但是,将它移到封闭类之外会使其编译:
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
class SomeActivity : AppCompatActivity() {
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这是预期的行为吗?文档似乎没有提到这一点.
在几个地方(例如" 在MSDN上创建用于JavaScript的Windows运行时组件,在C#和Visual Basic中 "),我已经看到它指定,如果您在.NET中编写要从JavaScript使用的类,那么您必须把它变成一个密封的课程.
这似乎是一种任意限制.为什么JavaScript只适用于密封类?