在基础对象中构造派生类型的对象

2024-01-16

vb.net 中是否可以有一个方法来构造 bass 类中任何派生类的对象? 在此代码中,x.Clone 应返回一个 Bar 对象。 这是使用两种不同对象类型在两个类中重复代码的唯一方法。

Module Module1

    Sub Main()
        Dim x As New Bar
        Dim y As Bar = x.Clone
    End Sub

End Module

Public Class Foo
    Implements ICloneable
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Clone = Me.new() 'fails to compile as not in a constructor
        Clone = new Foo 'constructs a new foo in the derived class
    End Function
End Class

Public Class Bar
    Inherits Foo
    'additional implementation
    'but no addition fields
End Class

答案具体取决于您想要在克隆方法中实现的目标。

如果您想创建当前类的新实例而不实际复制任何属性(听起来您可能有兴趣根据示例代码和描述进行操作),那么简单的解决方案是:

Public Class Foo
    Implements ICloneable

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Activator.CreateInstance(Me.GetType)
    End Function
End Class

您可以通过在 Bar 中添加消息(或某种调试或输出)来测试是否调用了此函数:

Public Class Bar
    Inherits Foo

    Public Sub New()
        MsgBox("Test")
    End Sub

End Class

如果你有Option Strict On,我强烈推荐,main 中的代码是:

Sub Main()
    Dim x As New Bar
    Dim y As Bar = DirectCast(x.Clone, Bar)
End Sub

但是,如果您有兴趣从当前类复制成员值,则可以使用会员克隆 http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx:

Public Class Foo
    Implements ICloneable

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone
    End Function
End Class

然而,这只会创建一个浅拷贝,将复制引用,并且不会调用 Bar 上的构造函数。当我们以这种方式使用 MemberwiseClone 时,我们总是添加一个可重写的方法,继承者可以使用该方法来执行克隆后清理:

Public Class Foo
    Implements ICloneable

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim oObject As Foo

        oObject = DirectCast(Me.MemberwiseClone, Foo)
        oObject.PostCloneCleanup()

        Return oObject
    End Function

    Protected Overridable Sub PostCloneCleanup()

    End Sub
End Class

Public Class Bar
    Inherits Foo

    Public Sub New()
        MsgBox("Test")
    End Sub

    Protected Overrides Sub PostCloneCleanup()
        MsgBox("PostCloneCleanup")
    End Sub

End Class

最后,如果浅复制或处理复制的引用不符合您的喜好,您可以使用一种廉价但非常有效的技巧来执行深复制:使用 BinaryFormatter 进行序列化和反序列化:

Public Function CreateDeepCopy(Of T)(ByVal oRecord As T) As T

    If oRecord Is Nothing Then
        Return Nothing
    End If

    If Not oRecord.GetType.IsSerializable Then
        Throw New ArgumentException(oRecord.GetType.ToString & " is not serializable")
    End If

    Dim oFormatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

    Using oStream As IO.MemoryStream = New IO.MemoryStream
        oFormatter.Serialize(oStream, oRecord)
        oStream.Position = 0
        Return DirectCast(oFormatter.Deserialize(oStream), T)
    End Using
End Function

这要求类是可序列化的,但这很容易做到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在基础对象中构造派生类型的对象 的相关文章

  • .NET 组件和 COM 组件有什么区别

    NET 组件和 COM 组件之间有什么区别 有时我们使用 NET 组件包含在我们的项目中 有时我们包含 COM 引用 背后的想法是什么 NET 组件是托管代码 内存处理已为您完成 COM http en wikipedia org wiki
  • web.config 转换为

    我有针对多个环境的 web config 转换 在配置文件中 我有一个 applicationSettings 部分 其中包含多个设置和值对 我尝试过根据用于匹配名称的语法并更改连接字符串以匹配设置并更改值 但转换失败 这是可能吗 所以我的
  • 查询 dns 别名

    我找到了一些code http msdn microsoft com en us library system net dns gethostbyaddress VS 71 aspx来自 msdn 站点 下面包含代码 看起来它将返回给定服务
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 将 C# 字符串传递给非托管 C++ DLL

    我有一个简单的应用程序 它加载一个非托管 dll 并从 C 向它传递一些字符串值 但在 C dll 应用程序中 我收到异常 试图访问读 写保护的内存 我的 DLL 导入如下所示 DllImport X dll CallingConventi
  • .NET 迭代器包装抛出 API

    我有一个带有 API 的类 它允许我请求对象 直到它抛出一个IndexOutOfBoundsException 我想将它包装到一个迭代器中 以便能够编写更清晰的代码 但是 我需要捕获异常以停止迭代 static IEnumerable It
  • FileInfo.BaseName 存在于 PowerShell 中,但不存在于直接 .NET 中

    为什么在 NET 中System IO FileInfo对象没有BaseName属性 但我可以通过 PowerShell 使用该属性 例如 FolderItems Get ChildItem Path C Where Object isno
  • 如何打开实际上已关闭的 Wifi 适配器的无线电?

    我在用着托管无线网络 http managedwifi codeplex com获取我的 Wifi 适配器的无线电状态 如果收音机实际上已关闭 如何将其打开 像这样的东西 WlanClient wlanClient new WlanClie
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • 将数据集导出到一个 Excel 文件的多个 Excel 工作表中

    我需要在同一工作簿的两个 Excel 工作表中导出两个数据集的值 我的查询是这样的 数据集一 DataSet ds1 new DataSet SqlCommand commandOpen new SqlCommand storedproc1
  • 从同步上下文调用异步方法

    我在代码中通过 HTTP 调用服务 最终使用 HttpClient SendAsync 方法 然后从 WebAPI 控制器操作调用此代码 大多数情况下 它工作得很好 测试通过 但是当我在 IIS 上部署时 我遇到了死锁 因为异步方法调用的调
  • 将字符串转换为双精度 - VB

    VB中有没有一种有效的方法来检查字符串是否可以转换为双精度型 我目前正在尝试将字符串转换为双精度型 然后查看它是否引发异常 但这似乎减慢了我的申请速度 Try if number then format it current CDbl x
  • 无法加载文件或程序集“Newtonsoft.Json”或其依赖项之一

    首先 它不仅仅是重复的 以下问题的答案都不适合我 http goo gl tS40cn http goo gl tS40cn http goo gl pH6v2T http goo gl pH6v2T 我刚刚使用 Nuget 包管理器更新了
  • 为什么 System.Math 有 Sin、Cos 等外部方法?

    MethodImpl MethodImplOptions InternalCall public static extern double Sin double a 其原因何在 MethodImplOptions InternalCall表
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 从 SQL Server 读取十进制值时出现溢出异常

    我想知道这是一个错误还是我做错了什么 我正在加载值SqlDataReader来自 SQL Server 2008 数据库 但在某些情况下 它无法将 SQL 值转换为 net 值 NET 4 0 我已将其追溯到一个测试用例 它演示了实际问题
  • 删除向量类成员

    我有一个 A 类 其成员是另一个 B 类的对象指针向量 class A std vector
  • 如何使用 winforms 在 vb.net 中制作大型按钮网格(24x20 或类似)?

    我正在 vb net WinForms 中制作一个座位预订系统 我需要用户能够选择他们想要使用的座位并改变颜色 这样他们就可以知道它已选择 我开始尝试使用按钮 但 480 个按钮严重减慢了表单的加载时间 然后我尝试了在行 列中带有按钮的数据
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类

随机推荐

  • 从 Neo4j 删除所有节点时出现 ConstraintViolationTransactionFailureException

    当尝试从 Neo4j 图形数据库中删除所有节点时 我过去已经在较小的数据集上成功完成过多次 我一直遇到Error undefined undefined运行此查询后 MATCH n DETACH DELETE n 我认为我尝试一次删除的节点
  • 使用什么对称密码来加密消息?

    我对加密一无所知 但我需要它 如何 假设您有一个节点系统 节点通过异步消息在网络上相互通信 节点不维护有关其他节点的会话信息 这是设计限制 假设您想确保只有您的节点可以读取正在发送的消息 我相信加密是解决这个问题的方法 由于节点不维护会话
  • 终端上的“快速构建”抛出“错误:找不到根清单”

    我想在终端上运行我的快速编程 所以我cd我的项目的根文件夹 然后运行 swift build 但是出现了错误 error root manifest not found有什么帮助吗 如果其他人偶然发现同样的问题 我的解决方案是 cd 到我的
  • 在 Windows 上运行 Django 时出现“WinError 10013”

    自从我遇到这个问题以来已经快一个月了 我非常感谢您的帮助 尝试登录我的 Django Web 应用程序时 我在 accounts login 处遇到 OSError 我能够登录 127 0 0 1 8000 admin 但不能登录 acco
  • findDOMNode 与 getElementById 对于普通 DOM 元素

    我不太确定这个问题有真正的答案 但我想知道是否最好使用以下命令在 React 应用程序中查找常规 DOM 元素 A refs 和 ReactDOM findDOMNode or b 普通旧 document getElementById 我
  • 导入而不执行类 - python

    我的问题是我有一个包含类的文件 并且在这个类内有一堆代码将被执行 所以每当我导入该文件时它就会执行 无需创建该类的对象 这是例子 FILE X class d def init self print print this will NOT
  • Gradle 和 Android 支持库

    几乎在每个 Android 应用程序中 我们都需要一些库项目 例如 ABS HoloEverywhere 等 其中大部分都在 Maven Central 中 这很好 不好的是 它们中的大多数都依赖于支持库 并且自然地指向 Maven Cen
  • 在双变量中获取数字的问题

    我的 java 程序中需要的函数出现了一些问题 我想检查 双精度 变量的总位数 例如 5 应该返回 1 5 0034 应该返回 5 2 04 应该返回 3 我的函数是这样的 private int getDoubleLength doubl
  • WPF Datagrid 绑定自定义列标题

    我试图弄清楚如何使用 MVVM 模式将 WPF DataGrid 的列标题和主要数据绑定到数据源 我正在寻找的结果如下所示 source vallelunga com http brian vallelunga com files data
  • 浮点按位运算的用处

    我注意到浮点存在 SSE 指令 这让我想知道 您可以对 fp integer union 中的标量执行相同的操作 我突然想到 如果对浮点数数组的各个分量进行按位或运算 则可以通过查看结果的符号位来快速确定它们中是否有任何一个为负数 浮点值的
  • 获取 TWIG 模板中的控制器名称

    我正在学习 symfony2 3 当我尝试在 twig 模板中获取控制器名称时出现错误 控制器 namespace Acme AdminBundle Controller use Symfony Bundle FrameworkBundle
  • Mac OS-X Mountain Lion 上的 GCC-4.2 错误,无法使用 pip / virtualenv 安装某些软件包

    我看到一个非常烦人的错误 我真的不知道如何处理 这似乎很常见 我几乎尝试了所有能找到的解决方案 但都无济于事 我正在尝试使用 pip 安装库 gevent psycopg2 和 greenlet 都遇到过这个问题 问题似乎是我的计算机找不到
  • 如何从服务器在 ViewPager 内的 VideoView 上播放视频

    我尝试开发一个应用程序从服务器检索视频并在 viewpager 内的 videoview 上播放 原始文件夹中的视频工作正常 但有两个问题 1 部分视频无法播放 或黑色活动显示 2 页面滚动时视频不停止 那么如何使用 URL 而不是 and
  • 如何在打开另一个 Javascript 下拉菜单时关闭另一个下拉菜单

    我不太熟悉 JavaScript 我希望能得到一些帮助来解决我似乎无法解决的问题 目前我的网站上有 2 个下拉菜单 一种是用于导航的下拉菜单 单击汉堡菜单图标时会激活该菜单 第二个下拉列表用于显示我网站上的类别 目前 当我单击一个下拉列表时
  • 检测浏览器缓存是否已满

    我们发现浏览器缓存已满是导致酒店后台出现问题的原因 它只影响我们的一小部分用户 但我们希望提醒他们该问题 并为他们提供一些如何自行解决问题的指导 我们希望使用与 GMail 使用的系统类似的系统 当它检测到您的浏览器缓存已满表现不正常时 它
  • Kafka中的延迟消息消费

    如何使用 Apache Kafka 生成 消费延迟消息 似乎标准 Kafka 和 Java kafka client 功能没有此功能 我知道我可以用标准的等待 通知机制自己实现它 但它看起来不太可靠 因此任何建议和良好实践都值得赞赏 Fou
  • Android Shake(Sensor) 服务,用于应用程序后台的震动检测

    我开发了一个具有晃动功能的应用程序 以便某些功能正常工作 因此我使用晃动类并实现了主活动 以便在应用程序运行时顺利工作 但我的问题是当我的应用程序进入睡眠或终止或停止时 如何检测背景震动 服务 我的摇摇班 public class Shak
  • 区别 - “e.preventDefault();”和“返回假;” [复制]

    这个问题在这里已经有答案了 有什么区别return false and e preventDefault e preventDefault 将防止默认事件发生并且return false停止传播
  • Android - Firebase 用户身份验证令牌会过期吗?

    我决定使用Volley并走 RESTful 路线Firebase因为当没有互联网连接时 他们的听众似乎会挂起 至少对于 Volley 它可以让我知道网络请求是否由于互联网连接而失败 我需要知道是否FirebaseUser身份验证令牌是否过期
  • 在基础对象中构造派生类型的对象

    vb net 中是否可以有一个方法来构造 bass 类中任何派生类的对象 在此代码中 x Clone 应返回一个 Bar 对象 这是使用两种不同对象类型在两个类中重复代码的唯一方法 Module Module1 Sub Main Dim x