c#中的继承

本文关键字:继承 | 更新日期: 2023-09-27 18:06:33

这很奇怪,但我真的需要它。我需要继承一个类没有继承他们的基类,但我不知道如何。

我有一个基本的抽象实体类从这样的框架:

public abstract class AbstractEntity
{
    public bool Validate(){};
    public List<ValidationErrors> erros;
    // and so many more properties and methods
}

我的自定义类继承这个抽象基类:

public class Contact : AbstractEntity
{
    public int id
    public string name;
    public string phone;
}

我在webservice上使用这个类Contact,我只需要自定义属性,我如何重用类Contact而不继承AbstractEntity?

我不想重复这个类。对不起,如果这听起来很愚蠢。

编辑

这是一个已经用代码生成器创建的项目,我不能改变类结构。由于这个原因,我想实例化那个类而不使用抽象类。

由于我现在无法更改,并且急需它,所以我将复制这个没有抽象的类并使用它。

c#中的继承

听起来你需要一个接口。

从AbstractEntity中提取一个接口(IAbstractEntity)。或者可能是来自Contact的iconcontact——问题不是很清楚哪个类有你想要共享的方法和属性。它看起来像这样:

public interface IContact
{
    int Id { get; }
    string Name { get; }
    string Phone { get; }
}

在联系人上实现IContact。然后修改任何只使用iconcontact中特定方法/属性的方法,使其使用iconcontact而不是Contact。

我同意@Jamie-Penney的观点,听起来你应该看看http://en.wikipedia.org/wiki/Data_transfer_object

最后,如果这是一个DTO,您可能会发现自己需要AutoMapper

之类的东西

据我所知,您无法打破继承链。如果你想要一个不继承AbstractEntity的Contact,你必须创建一个不把AbstractEntity列为父类的新Contact类。

对不起,这就是c#的设计。

尝试收容。

public class NotAnEntity 
{
    public Contact { get; set; }
    public static implicit operator Contact(NotAnEntity other)
    {
        return other.Contact;
    }
}

虽然我认为使用简单的DTO可能是最简单的解决方案,但另一种选择是在Contact类上实现IXMLSerializable接口,并让它只序列化您关心的属性。当然,这也会在其他情况下影响对象的XML序列化,而不仅仅是在web服务中。