(un)C#中的继承

时间:2011-08-24 00:24:16

标签: c# asp.net inheritance

这很奇怪,但我确实需要它。我需要继承一个类而不继承它们的基类,但我不知道如何。

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

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;
}

我在网络服务上使用此类联系,我只需要自定义属性,如何重新使用联系类而不继承 AbstractEntity

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

修改

这是一个已经用代码生成器创建的项目,我无法更改类结构。出于这个原因,我想在不使用抽象类的情况下实例化该类。

由于我现在无法改变它并迫切需要它,我将在没有抽象的情况下复制这个类并使用它。

4 个答案:

答案 0 :(得分:2)

听起来你需要一个界面。

从AbstractEntity中提取接口(IAbstractEntity)。或者也许来自联系人的IContact-关于哪个类具有您想要共享的方法和属性的问题不是很清楚。它看起来像这样:

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

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

我同意@ Jamie-Penney,听起来你应该阅读http://en.wikipedia.org/wiki/Data_transfer_object

最后,如果这是一个DTO,你可能会发现自己需要像AutoMapper这样的东西

答案 1 :(得分:1)

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

很抱歉,这就是C#的设计方式。

答案 2 :(得分:0)

尝试遏制。

public class NotAnEntity 
{
    public Contact { get; set; }

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

答案 3 :(得分:0)

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