如何克隆继承的对象?

2023-12-01

我有一个Tile使用此方法的类:

    public object Clone()
    {
        return MemberwiseClone();
    }

还有另一个班级Checker继承自Tile.

我也有一个Board类是一个List<Tile>。我想克隆板,所以我写了这样的:

    public Board Clone()
    {
        var b = new Board(width, height);
        foreach (var t in this) b.Add(t.Clone());
        return b;
    }

但它会抛出一个错误:

无法从“object”转换为“Checkers.Tile”

现在我可以做Tile.Clone方法返回一个Tile相反,但随后将MemberwiseClone复制子中的附加属性Checker还有?


如果这不是问题,那么上述之间的语义差异是什么Board.Clone方法和这个?

    public Board Clone()
    {
        using (var ms = new MemoryStream())
        {
            var bf = new BinaryFormatter();
            bf.Serialize(ms, this);
            ms.Position = 0;
            return (Board)bf.Deserialize(ms);
        }
    }

因为它们肯定会对我的程序产生不同的影响,即使当我打印电路板时looks相同。我不认为有什么事情正在发生cloned但正在返回一个引用。这Board演员看起来像这样:

    public Board(int width = 8, int height = 8)
    {
        this.width = width;
        this.height = height;
        this.rowWidth = width / 2;
        this.Capacity = rowWidth * height;
    }

The Tile类实际上没有任何属性。检查器只有两个枚举属性:

public enum Color { Black, White };
public enum Class { Man, King };

public class Checker : Tile
{
    public Color Color { get; set; }
    public Class Class { get; set; }

Yes, 会员克隆还将复制Checker-仅限字段。 MemberwiseClone 无法知道您的返回类型Clone方法;因此,它的行为不能依赖于它。


关于克隆实现和序列化之间的区别:MemberwiseClone创建一个浅拷贝Tiles 的:如果 Tile(或 Checker)引用某个对象,则该 Tile 的克隆仍然引用该对象same对象(而不是它的副本)。

另一方面,您的序列化代码是众所周知的做法用于创建一个深拷贝董事会的:整个依赖对象树被序列化和反序列化。

当然,只有当您的图块(或跳棋)包含具有引用类型的字段时,这才会产生影响。

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

如何克隆继承的对象? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • HTTP POST 请求 ANDROID 4(在 2.3 中工作)?

    好吧 事情是这样的 我编写了一个应用程序 它通过 HTTP 发布 从 Web url 请求数据 使用 JSon 数组返回数据 然后我解析这些数组以获得我想要的内容 直到使用 android 2 3 x 没有问题 但当我在 Android 4
  • 如何在android webview中使用弹出窗口

    为了我自己的理解 我正在使用 Webview 开发类似浏览器的应用程序 我还不清楚如何在 android Webview 中使用弹出窗口 我遇到了这些方法onJsAlert onJsBeforeUnload onJsConfirm 等来处理
  • Emberjs - 将 {{ input }} 过滤器栏与我的对象列表连接起来。当我输入时,列表会过滤

    我正在尝试将其纳入其中working例子http jsbin com AViZATE 37 edit我自己的项目的过滤搜索栏 搜索栏似乎没有连接到我的对象列表 让我告诉你我做了什么 App RecordCategoriesControlle
  • 从 R 运行 Python

    我知道两种语言 R Python 都有多个库来调用另一种语言的模块 我正在寻找一种方法让我的代码后端在 python 中运行 主要是因为 pyc 和速度 并且前端在 R 中运行 这样我就可以拥有一个闪亮的应用程序 我找不到为后端制作 pyt
  • iFrame 内容在 IE8 中不显示[重复]

    这个问题在这里已经有答案了 我有一个带有 iFrame 的网站 主页上有一些非常基本的 JS iframed 页面也有简单的 JS 当我照常嵌入 iframe 时 除了 IE8 之外 它在所有浏览器中都可以正常工作 我尝试了各种方法 第一
  • 错误 - “全局符号需要显式包名称”

    我正在尝试编写矩阵乘法的脚本 它只是一个基本程序 但我无法弄清楚以下错误 全局符号 ref mat1 需要在 multiplication pl 第 49 行显示显式包名称 全局符号 ref mat2 需要在 multiplication
  • 从另一个表中的另一列计算列值

    我有一个表 其中包含商店中每件商品的单价和其他详细信息 CREATE TABLE Item Item id CHAR 4 Description CHAR 40 Sizes CHAR 40 Weight REAL Unit price RE
  • 参考 XSD 模型组的特定元素?

    我们可以创建一个组并引用该组的元素吗 例如 我们有一个小组说
  • 使用 iMacros 和 javascript 检查 html 元素是否存在

    我想检查 iMacros 中是否存在 HTML 元素 如果是的话 我想访问一个 URL 如果没有 我想转到其他网址 因为 iMacros 没有语句 所以我将 javascript 与 iMacros 的 EVAL 一起使用 这是处理 jav
  • 日历月份错误

    我尝试用日历设置几年后的简单日期 字符串日期是此方法的参数 SimpleDateFormat format new SimpleDateFormat dd mm yyyy String DateTimeParts date split St
  • 使用discord.py更改角色层次结构

    我想在discord py 中创建一个新角色 但我希望这个角色位于 比方说 角色中的第三位 我怎样才能实现这个目标 你会使用Role edit 通过一个position值 该值必须低于您的最高角色的职位 bot command async
  • patsy 的倒数

    Patsy 的幂不允许负整数 所以 如果我们有一些系列数据X patsy dmatrices X X 1 X 返回错误 我如何将 X 的倒数添加到这样的帕西公式中 运算符的特殊含义在嵌入式函数调用中被关闭 所以如果你写X 1 x然后帕西将其
  • 使用Boost预处理器解析元素序列

    我定义了一个宏 define TYPES height int 10 width int 20 如何使用 Boost Preprocessor 来扩展这个宏 int height 10 int width 20 我最多能得到的是高度 整数
  • JavaScript 计算公式不起作用

    我有以下 JavaScript 函数来使用文本框进行一些计算 但是当我在文本框上调用此函数时 它不起作用 这是我的JS代码 Update
  • 如何在 SQL Server 中动态使用数据库名称

    我需要获取 SQL Server 中的所有表名 为此 我使用以下代码 select TABLE NAME from INFORMATION SCHEMA TABLES 我需要使用动态数据库名称 为此 我尝试使用以下代码 Declare db
  • 如何使用CSV Config Set的共享模式在Jmeter中运行线程?

    有没有办法在 CSV 数据集配置中使用 共享模式 的 编辑 选项 我在官方网站上找到了说明吗 apache jmeter 组件 CSV 数据集配置 标识符 共享相同标识符的所有线程共享相同的标识符 文件 例如 如果您有 4 个线程组 您可以
  • 在启用 crsf 和安全组件的 cakephp 3.4 中通过 ajax 发送表单

    需要帮忙 我希望能够通过 ajax 将表单发送到控制器进行处理 同时在应用程序控制器 cakephp 3 4 中启用 crsf 和安全组件 将不胜感激我能得到的任何帮助 谢谢 为了发送 ajax 请求 您需要首先通过文档中指定的 head
  • 如何将 gzipped rdf 文件加载到 rdf4j 存储库?

    我想将 gzipped rdf 文件加载到org eclipse rdf4j repository Repository 上传期间 必须将状态消息记录到控制台 我的 rdf 文件的未压缩数据大小约为 1GB 压缩数据大小约为 50MB 实际
  • 如何判断 Intent.createChooser 选择了哪个应用程序?

    Code Intent launchIntent new Intent Intent ACTION MAIN launchIntent addCategory Intent CATEGORY HOME Intent chooser Inte
  • 如何克隆继承的对象?

    我有一个Tile使用此方法的类 public object Clone return MemberwiseClone 还有另一个班级Checker继承自Tile 我也有一个Board类是一个List