我有一个抽象的基类Base,它有一些共同的属性,以及许多派生的,它们实现不同的逻辑,但很少有其他字段.
public abstract Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }
}

有时我需要克隆派生类.所以我的猜测是,只需在我的基类中创建一个虚拟Clone方法,并且只在具有其他字段的派生类中覆盖它,但当然我的Base类不再是抽象的(这不是问题,因为它只有受保护的构造函数).

public Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }

    public virtual Base Clone() { return new Base(); }
}

public A : Base { }
public B : Base { }

>问题是,因为我无法知道我的Base类中派生类的类型,即使我在派生类上调用它,这也不会导致有一个Base类实例吗? (a.Clone();)(实际上在测试之后这是发生了什么,但也许我的测试设计得不好,这就是为什么我对它有疑问)
>有没有一种好的方法(模式)来实现一个基本的克隆方法,它可以按照我的预期工作,或者我必须在每个派生类中编写相同的代码(我真的想避免这种情况……)

谢谢你的帮助

解决方法

只需覆盖克隆并使用另一种方法来创建CreateInstance然后做你的东西.

这样你就可以只有Base类来避免泛型.

public Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }

    public virtual Base Clone() 
    { 
        var bc = CreateInstanceForClone();
        bc.field1 = 1;
        bc.field2 = 2;
        return bc;
    }

    protected virtual Base CreateInstanceForClone()
    {
        return new Base(); 
    }
}


public A : Base 
{     
    protected int fieldInA;
    public virtual Base Clone() 
    { 
        var a = (A)base.Clone();
        a.fieldInA =5;
        return a;
    }

    protected virtual Base CreateInstanceForClone()
    {
        return new A(); 
    }
}

c# – 从基类方法克隆派生类的更多相关文章

  1. 使用xib创建自定义视图

    但是,您必须接受您的XIB将包含根视图或其他内容,这些视图将作为子视图添加到放入Placement的类的实例中.这样,你应该有类似的东西:XIB与您的自定义视图内容:添加XIB的位置:由于添加到展示位置的视图实例与XIB中的文件所有者相同,因此您可以在XIB和Placement中设置出口和操作.只是不要忘记你的XIB中的根视图不是UIKit将创建放置到Placement的实例.为方便起见,请在下面找到我的代码,该代码是基类,以便于创建此类视图:

  2. 防止序列为空

    作者:EricaSadun,原文链接,原文日期:2016-05-11译者:pucca;校对:wiilen;定稿:CMB昨天在Swift-Users有人提问如何防止序列为空。这个问题来源于如何在断言中测试一个序列,由此引发的问题是如果序列为空,会返回true来满足断言。我们先不考虑这种处理是否有问题,JeremyPereira提出了一个相当巧妙的解决方案:但从此讨论中延伸出的另一个大问题是“如何优雅地判断一个序列是否为空?”。本文由SwiftGG翻译组翻译,已经获得作者翻译授权,最新文章请访问http://

  3. 13.2 Swift派生类的构造方法

    /**13.2-派生类的构造方法.mp4*/classAB{vara:Intvarb:Int//指定构造方法,不允许出现构造器代理,self.init(...)init{self.a=aself.b=bprint("ClassABinit!

  4. 13.4 Swift派生类构造方法的两段式构造

    /**13.4-派生类构造方法的两段式构造*//**两段式构造-构造过程可以划分为两个阶段第一阶段,确保所有的存储属性都初始化完毕,第二阶段,对父类中的存储属性做进一步的处理。可以防止属性在被初始化之前访问,也可以防止属性被另外一个构造器意外的赋值。

  5. Swift3.0 - 类型转换

    Swift使用is判断当前对象是否为某个类的对象,作用同Java的instanceof关键字;Swift使用as作为强转操作符,将基类引用转换为派生类引用。

  6. 为什么在Swift中甚至需要便利关键字?

    由于Swift支持方法和初始化程序重载,因此可以将多个init放在一起,并使用任何您认为方便的:那么为什么便利关键字也存在呢?`我在thisanswer年轻微触及它,其中我详细地覆盖了Swift的初始化规则,但主要关注的是所需的词。因为Swift不允许未初始化的变量,所以不能保证从你继承的类继承所有(或任何)初始化器。所以方便关键字做的是告诉我们哪些初始化器可以被添加没有默认值的实例变量的子类继承。它只意味着Inheritor只有一个指定的初始化器。

  7. swift – 检查Hashable一致性

    我有一个基本协议(模型),一些结构符合.它们也符合Hashable我有一个函数,它接受一个符合Model的对象数组.如何将[Model]传递给需要Hashables而不制作ModelHashable的函数?我试图避免这种情况因为当我这样做时,我得到“模型不能用作通用约束……”

  8. swift – Sprite-kit:在圆形路径中移动元素

    我正试图让元素在cercle的边缘移动.>我已经在屏幕中间创建并定位了一个cercle:>然后我创建了另一个精灵并在其上添加了一个动作:宇宙飞船的第一次旋转(见下图)完全遵循圆的边缘,但第二次迭代改变了宇宙飞船的位置并将其移出屏幕边界.这是正常的还是我做错了什么?

  9. 如何在Swift中用它创建类和实例对象的数组?

    能够实例化适当的对象?您只需要一个必需的init,一些方法来创建一个实例,该实例将在您希望其工作的所有类型之间共享.保存init方法的协议可以正常工作.显然,当init不需要参数时,这种方法最简单.缺点是您需要向下转换结果实例.

  10. JSP页面文件中base标记用法实例分析

    这篇文章主要介绍了JSP页面文件中base标记用法,以实例形式较为详细的分析了JSP中base标记的功能与具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部