C# 基类方法能否返回派生类的类型?

C# 基类方法能否返回派生类的类型?,c#,inheritance,base-class,C#,Inheritance,Base Class,根据我读到的其他帖子,这似乎是不可能的,但我想我会发布我正在尝试做的事情,看看是否有人知道解决方案 我试图将“Clone()”方法添加到从Telerik开放访问域模型生成的类中。没问题。我能够找出如何将基类添加到生成的实体模型中,以便通过基类识别这些类。() 我希望所有这些实体模型类都能够克隆自己。我也找到了解决办法。() 现在我有了一个基类,我想向从该基类派生的每个类添加一个Clone()函数。所以基类似乎是放置它的自然场所。。。对吧? public abstract class DBEnti

根据我读到的其他帖子,这似乎是不可能的,但我想我会发布我正在尝试做的事情,看看是否有人知道解决方案

我试图将“Clone()”方法添加到从Telerik开放访问域模型生成的类中。没问题。我能够找出如何将基类添加到生成的实体模型中,以便通过基类识别这些类。()

我希望所有这些实体模型类都能够克隆自己。我也找到了解决办法。()

现在我有了一个基类,我想向从该基类派生的每个类添加一个Clone()函数。所以基类似乎是放置它的自然场所。。。对吧?

public abstract class DBEntityBase
{
    /// <summary>
    ///     Gets a COPY of the instance in it's current state
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    protected T Clone<T>()
    {
        return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(this));
    }
}
然而,在构建时,我得到了错误

“DeliverableEntity”未实现继承的抽象成员 “DBEntityBase.Clone()”

可能是由于返回类型

我知道我可以将Clone()方法放在一个单独的实用程序类中,而不是直接在每个实体模型中实现它。。。这将使我绕过我的问题(并可能节省很多实现代码),但我仍然想知道为什么这不起作用。看来应该有办法做到这一点

更新

为了回应@luan的第一个回复(谢谢),我将更改为“覆盖”

我喜欢这个解决方案,因为它有一个基类的简单性,在这个基类中,实现是在一个位置定义的(而我正在考虑在每个派生类中单独实现一个抽象方法),而且由于它与DBEntityBase类关联,并且在同一命名空间中,它成为“contract”由基类定义,这意味着只要我有一个从DBEntityBase派生的类,我就可以指望它可用。

尝试一种扩展方法:

public T Clone<T>(this T obj) where T : DBEntityBase
{
  return /* insert code that creates clone here */
}
public T Clone(这个T对象),其中T:DBEntityBase
{
return/*在此处插入创建克隆的代码*/
}
老实说,我认为这是行不通的,因为我预计C#无法准确确定它是什么的扩展。然而,很显然,它确实如此

新的C#版本9.0将支持,这意味着您可以覆盖
Clone()
并返回更具体的类型。这将汇编:

public partial class DeliverableEntity
{
    public override DeliverableEntity Clone()
    {
        return this.Clone<DeliverableEntity>();
    }
}
公共部分类可交付性
{
公共覆盖可交付性克隆()
{
返回此.Clone();
}
}

不确定这是否是一个好主意(甚至是可能的),但我想知道沿着
T Clone(this T obj)这一行的扩展方法,其中T:DBEntityBase{/*返回一个Clone*/}
是否可以完成这项工作。您从未实现过抽象方法-使用
new
关键字意味着您只需隐藏父方法。您需要使用
覆盖
,这将导致另一个错误,因为返回类型必须与基本方法中的返回类型相同。修复此问题时,您会发现它无论如何都不起作用,因为重载解析不包括C#中的返回类型。你可能想重新考虑一下你的设计。@Flynn1179是的,这是绝对可能的,你应该把它作为一个答案发布:)@Luaan-谢谢你的提醒。这实际上是一个疏忽,代码被复制和发布,但我在重写方面也有问题。这是一个让我真正困惑的问题。@Flynn1179-请将您的回答作为答案发布,我将接受它!成功了!非常感谢。再次感谢你!我在OP的解决方案部分添加了实现的细节。
DeliverableEntity originalEntity = new DeliverableEntity();
DeliverableEntity clonedEntity   = originalEntity.Clone();
public partial class DeliverableEntity
{
    public override DeliverableEntity Clone()
    {
        return this.Clone<DeliverableEntity>();
    }
}
namespace DAL
{
    public partial class DeliverableEntity : DBEntityBase
    {
         // ... Code generated from ORM 
    }

    public partial class DeliverableItemEntity : DBEntityBase
    {
         // ... Code generated from ORM 
    }

    public partial class DeliverableItemAttrEntity : DBEntityBase
    {
         // ... Code generated from ORM 
    }
}

namespace DAL
{
    public static class EntityExtensionMethods
    {
        public static T Clone<T>(this T entity) where T: DBEntityBase
        {
            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(entity));
        }
    }
}
    // Create the original instances of the entities    
    DeliverableEntity origDeliverable       = new DeliverableEntity();
    DeliverableItemEntity origItem          = new DeliverableItemEntity();
    DeliverableItemAttrEntity origItemAttr  = new DeliverableItemAttrEntity();

    // now here's the magic 

    DeliverableEntity cloneDeliverable      = origDeliverable.Clone();
    DeliverableItemEntity cloneItem         = origItem.Clone();
    DeliverableItemAttrEntity cloneItemAttr = origItemAttr.Clone();
public T Clone<T>(this T obj) where T : DBEntityBase
{
  return /* insert code that creates clone here */
}
public partial class DeliverableEntity
{
    public override DeliverableEntity Clone()
    {
        return this.Clone<DeliverableEntity>();
    }
}