编译器如何优化由密封类实现的虚拟方法
我想知道如何优化以下代码.专门针对虚拟和直接呼叫.我已经评论了我认为一切的优化方式,但这些只是猜测. public abstract class Super { public abstract void Foo(); public void FooUser() { Foo(); } } public class Child1 : Super { public override void Foo() { //doSomething } } public class SealedChild : Super { public override void Foo() { //doSomething } } class Program { void main() { Child1 child1 = new Child1();
14 2024-04-24
编程技术问答社区
如何解决无法从密封类继承的问题?
今天我在WPF中工作 我尝试从System.Windows.Shapes.Line类继承,这样: class MyLine : System.Windows.Shapes.Line { public Ln() { this.Stroke = Brushes.Black; } } 我刚刚意识到,该线路被密封. 我的目标是创建一个类,它将像Line类一样工作(将其放在Canvas上),但是我不想每次都用添加刷子弄乱我的代码,以便说总是想要带有2px宽度的黑色刷子/中风. 我觉得我想做错了. 我应该怎么做? 解决方案 您可以创建一个工厂类: public class LineFactory { public Line Create() { //create and return a Line object } } 工厂也可能是st
4 2024-04-20
编程技术问答社区
我怎样才能将一个没有无参数构造函数的密封类XML序列化?
我目前正在使用XMLSerializer来序列化我自己的一类列表.该类的属性之一是没有无参数构造函数的密封类的实例,因此XML序列化器拒绝序列化类.我该如何解决?我需要该属性被序列化. 我有什么办法可以指定该课程应如何序列化? 我们想留在XML;我可以使用另一个XML序列化机吗? 再次,如果这是骗子,我深表歉意,但我不知道该搜索什么. [编辑]要澄清,我无法访问密封类的来源. 解决方案 不可能直接做. XmlSerializer无法应对没有无参数构造函数的类. 我通常要做的是将无参数类包装在与XML兼容的另一个类中.包装器类具有无参数构造函数和一组读写属性.它具有称为真实类的构造函数的FromXml方法. [XmlIgnore] public SomeClass SomeProperty { get; set; } [XmlElement("SomeProperty")] public XmlSomeClass XmlSomeProperty
6 2024-04-20
编程技术问答社区
为什么这个C#类的声明能被编译?
这个问题确实毫无意义,但是我很好奇: 这个: public sealed class MyClass { protected void MyMethod(){} } 编译,但发出警告 当时: public sealed class MyClass { public virtual void MyMethod(){} } 不编译.出于好奇心,是否有理由? 解决方案 我能想到的唯一原因是,有时您需要编写受保护的方法来覆盖其他受保护的方法.语言可以旨在允许这样做: protected override void Foo() 但不是这个 protected void Foo() 在 public virtual void Foo() virtual的存在 是没有用的.与缺少有用的东西相比,"错误"的存在可能更容易理解. 在这种情况下,虚拟的表现也可能含义,而对受保护的东西而不是私人也可能没有 - 因此,这有点严重
8 2024-04-19
编程技术问答社区
什么是C#中的内部密封类?
我正在查看一些C#代码,以扩展VS2010中的语言支持(OOK示例).我看到了一些名为internal sealed class 的课程 这些做什么?可以使用它们吗? 解决方案 这是一个类: internal:只能从汇编内访问它的定义(或朋友汇编). sealed:不能继承. 将类标记为internal是一种防止汇编的外部用户使用它们的方法.这实际上是设计封装的一种形式,恕我直言,最好将不是预期的公共API \对象模型的一部分标记为internal>>>>>.从长远来看,这使您的库用户无法将自己耦合到您不打算使用的类型.这种意想不到的耦合会损害您更改和发展库的实现方式,因为您在不破坏客户的情况下无法更改它们.使用internal有助于将图书馆的公众和可用表面积保持在预期的状态. 将类标记为sealed阻止这些类被继承.这是一种非常急剧的设计意图,如果某个类已经如此专业,以至于明智的选择是可以直接或通过覆盖其行为添加的其他功能. ,这是有用的. in
8 2024-04-17
编程技术问答社区
当属性被改变时,引发事件
我需要在更改属性的价值时提出一个事件.就我而言,这是更改webview.source的时候.我无法派出派生的班级,因为该类被标记为密封.有什么方法可以举起活动? 谢谢. 解决方案 更改财产时提高事件 对于这种情况,您可以创建一个DependencyPropertyWatcher来检测DependencyProperty更改的事件.以下是您可以直接使用的工具类. public class DependencyPropertyWatcher : DependencyObject, IDisposable { public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( "Value", typeof(object), typeof(Dependency
8 2024-04-17
编程技术问答社区
我们是否可以在一个类中声明密封方法
class X { sealed protected virtual void F() { Console.WriteLine("X.F"); } sealed void F1(); protected virtual void F2() { Console.WriteLine("X.F2"); } } 在上面的代码中有编译时间错误: x.f()'不能密封,因为它不是覆盖 x.f1()'不能密封,因为它不是覆盖 这是否意味着我们只能应用sealed关键字乳清,我们必须覆盖某些方法? 解决方案 好吧,密封关键字阻止方法成为 overriden ,这就是为什么它不会使sence 使用虚拟声明 - 只需删除virtual而不是声明virtual sealed. 在摘要方法上,由于摘要方法必须超过 在 非虚拟方法上 因此,唯一的选择是override sealed,它是替代的,但
2 2024-04-16
编程技术问答社区
我是否可以使一个类型 "除内部类型外密封"?
我想制作一种可以从同一组件中通过类型继承的类型,但不能从组件外部继承.我确实希望该类型在大会外看到. 这是可能的吗? 解决方案 您可以使构造函数内部: public class MyClass { internal MyClass() { } } 每个从基类派生的类都必须调用其构造函数中基类的构造函数.由于如果基类在不同的组件中,则无法调用构造函数,因此派生的类未编译. 其他解决方案 我认为这个问题仍然可以从语义上正确的答案中受益……这是"否".您不能将类型声明为"仅密封外部组件". 不要误会我的意思:DTB的答案是一个很好的答案.内部构造函数是您可以从所需结果中获得的最接近的. 但是,我认为阅读此书的任何人都应该意识到,在此示例中,MyClass不会被描述为在运行时被密封.这不太可能是一个问题,但是如果可能基于反思(来自您的代码或第三方库)引起逻辑,以在此特定类型上采取不同的作用.这是要牢记的. 现在,要进一步扩展DTB的示例代
12 2024-04-14
编程技术问答社区
C# sealed vs Java final
有人请告诉我,因为以下使用sealed不编译?鉴于我将sealed替换为final并将其编译为Java,则可以工作. private sealed int compInt = 100; public bool check(int someInt) { if (someInt > compInt) { return true; } return false; } 解决方案 这是因为final在Java中含义很多不同的内容,具体取决于您使用的位置,而C#中的sealed 仅适用于 事件). 在Java中final可以应用于: 类,这意味着不能继承类.这相当于c#'s sealed. 方法,这意味着该方法在派生类中不能被覆盖.这是C#中的默认值,除非您将方法声明为virtual,并且在派生的类中,可以再次使用sealed进行进一步的派生类.这就是为什么您在c#中看到sealed成员在java中的成员少得多. 字段和变量
6 2024-04-14
编程技术问答社区
防止一个方法在C#中被重写
如何防止在派生类中覆盖方法? 在Java中,我可以在我希望防止被覆盖的方法上使用final修改器来做到这一点. 我如何在C#? 中实现相同 我知道使用sealed,但显然我只能将其与override关键字一起使用? class A { public void methodA() { // Code. } public virtual void methodB() { // Code. } } class B : A { sealed override public void methodB() { // Code. } } 因此,在上面的示例中,我可以防止methodB()被从类B派生的任何类覆盖,但是我如何首先阻止class B首先覆盖methodB()? 更新:当我发布此问题时,我错过了A类声明中的virtual关键字.纠正了它.
6 2024-04-14
编程技术问答社区
C#中的封存方法
我是C#的新手.作为密封的,我们可以避免进一步的这种方法的重大覆盖.) 我创建了一个演示,但不明白上线和密封方法的使用的含义.以下是我的代码: - using System; namespace ConsoleApplication2 { class Program:MyClass { public override sealed void Test() { Console.WriteLine("My class Program"); } static void Main(string[] args) { Program obj = new Program(); obj.Test(); Console.ReadLine(); } } class MyClas
6 2024-04-12
编程技术问答社区
为什么类在默认情况下不被密封?
我只是想知道,因为密封关键字的存在表明这是班级作者关于是否允许其他班级继承的决定,为什么默认情况下不默认按下班级,关键字将它们明确标记为可扩展的? 我知道这有些不同,但是访问修饰符以这种方式工作.默认值仅通过插入关键字授予限制性和填充访问. 不过,我很有可能没有正确地考虑这一点,所以请保持人性! 解决方案 在我看来,不应该有默认语法,这样您总是会明确地写下所需的内容.这迫使编码人员了解/思考更多. 如果您希望一堂课是可以继承的,那么您写 public extensible class MyClass 否则 public sealed class MyClass 顺便说一句,我认为访问修饰符也应该使用,禁止默认访问修饰符. 其他解决方案 我会说这只是一个错误.我认识许多人(包括我自己),他们认为默认情况下确实应该密封课程.该营地中C#设计团队中至少有几个人.自C#首次设计以来,摆锤已经远离了继承. (当然,它有其位置,但我发现自己使用它
16 2024-04-12
编程技术问答社区
IEquatable<T>、IComparable<T>是否应该在非密封类上实现?
任何人对IEquatable或IComparable是否有任何意见,通常应该要求T是sealed(如果是class)? 这个问题是我出现的,因为我正在编写一组旨在帮助实施不变的类的基础类.基类打算提供的部分功能是平等比较的自动实现(使用类的字段以及可以应用于字段以控制平等比较的属性).完成后应该非常好 - 我正在使用表达式树动态创建每个T的编译比较功能,因此比较函数应该非常接近常规平等比较功能的性能. (我使用的是System.Type上的不变词典,并以合理性能的方式存储生成的比较功能) ) 一件事出现了,是检查成员字段平等的功能.我最初的目的是检查每个成员字段的类型(我将调用X)是否实现IEquatable.但是,经过一番思考,除非X是sealed,否则我认为这是安全使用的.原因是,如果X不是sealed,我无法确定X是否适当地将平等检查委派给X上的虚拟方法,从而允许子类型覆盖平等比较. 这将提出一个更普遍的问题 - 如果类型未密封,它是否真的实现了这
14 2024-04-12
编程技术问答社区
我是否应该封存所有我知道不应该作为基类使用的类?
我应该密封我认识的所有课程,即使没有切实的性能或安全问题,也不应该用作基础类,还是只是添加cruft? 解决方案 可扩展的类实现可以扩展的功能的类 - 这是类似于类的其他功能的功能,应像对待一样对待,与方法没有什么不同.应仔细考虑所有功能,以确保使用该功能达到客户的目标.需要设计,实施,审查针对安全问题的功能,进行调试,记录和维护. 所有这些费用和努力通常都需要花钱.你花谁的钱?他们可能对您是否应该执行此功能有意见. 基本上,您有三个选择: 1)花钱做这项功能,以便您有信心它是正确,健壮,安全并满足用户需求的. 2)除了运送该功能外,什么都不做,希望运送未经警告,未知,未知的功能,没有任何安全风险并不会伤害您,您的雇主或您的客户. 3)密封课程.如果您发现(1)是正确的选择,请稍后再进行. 我说(3)物有所值.我总是密封我编写的每个班级,这些班级不是为可扩展的. 其他解决方案 将类设置为sealed不是cruff的,因为这样做会在您的代
4 2024-04-11
编程技术问答社区
如何在Kotlin中使用密封类实现ViewHolder?
我在这条推文中看到了一个有趣的视图持有人的实现,override fun onBindViewHolder(holder: SealedAdapterViewHolder, position: Int) { return when (holder) { is HeaderHolder -> holder.displayHeader(items[position]) is DetailsHolder -> holder.displayDetails(items[position]) } } 不幸的是,我无法弄清楚如何实施Thouse持有人.而且我没有找到这个技巧的例子. 在我的视图持有人中,我必须扩展recyclerview.iwholdholder和我必须扩展密封的类,以便我可以在" wher qhhesh en en en en en en"中使用它.不允许多次吸入. 那么可能,如果是如何? P.S. 原始作者写下: 您也可以在回收文章适配器中使用密
10 2024-02-17
编程技术问答社区
让密封类的层次结构成为可包裹的
我有类似的东西,以下我想将它们作为意图参数传递; sealed class BasketType : Parcelable { class BasketOne(val basketId: String): BasketType() { constructor(parcel: Parcel) : this(parcel.readString()) { } override fun writeToParcel(parcel: Parcel, flags: Int) { super.writeToParcel(parcel, flags) parcel.writeString(basketId) } override fun describeContents(): Int { return 0 }
14 2024-02-15
编程技术问答社区
传递一个密封的类作为函数参数 android
我有一个密封的类,代表我的API的翻新响应. sealed class NetworkResponse { data class Success(val body: T) : NetworkResponse() data class ApiError(val body: U, val code: Int) : NetworkResponse() data class NetworkError(val error: IOException) : NetworkResponse() data class UnknownError(val error: Throwable?) : NetworkResponse() } 所以现在我想创
14 2024-02-10
编程技术问答社区
抽象封存类
只是关于C ++/CLI的一个小问题. 摘要类具有摘要方法,可以通过派生类实现, 密封的类不允许继承. 所以为什么我们在.NET基类库中有一些类别定义为抽象密封的类,您可以找到很多.??! 解决方案 它等效于C#语言中的"静态类".几乎用来编写所有BCL类的语言.所有方法必须是静态的.将其抽象声明并密封可防止任何人从类中衍生并创建一个实例. 类方法是C和C ++语言中自由功能的确切等效物. CLR不支持的东西.
12 2024-01-09
编程技术问答社区
在Kotlin中对密封类之外的引用?
我正在尝试创建一个使用自己的状态来在其持有参考的外部对象状态下操作的类.外部对象可以是A类或B类,但不受作者控制.因此,创建了一个密封的类来访问其常见属性,per @Simy4 . // *** DOES NOT COMPILE *** class A { // foreign class whose structure is not modifiable val prop get()= "some string made the Class-A way" } class B { // foreign class whose structure is not modifiable val prop get()= "some string made the Class-B way" } data class ABTool (val obj:AB, val i:Int, val j:Int) { // class that manipulates i and j a
10 2024-01-09
编程技术问答社区
Scala's sealed abstract vs abstract class
sealed abstract和abstract scala类之间有什么区别? 解决方案 区别在于,密封类的所有子类(无论是否抽象)都必须与密封类同一文件中. 其他解决方案 AS emplated >密封类的子类(是否抽象)必须在同一文件中.这样做的实际结果是,如果模式匹配不完整,则可以警告编译器.例如: sealed abstract class Tree case class Node(left: Tree, right: Tree) extends Tree case class Leaf[T](value: T) extends Tree case object Empty extends Tree def dps(t: Tree): Unit = t match { case Node(left, right) => dps(left); dps(right) case Leaf(x) => println("Leaf "+x) // cas
32 2024-01-09
编程技术问答社区