(un) Наследование в C # - PullRequest
0 голосов
/ 24 августа 2011

это странно, но мне это действительно нужно. Мне нужно наследовать класс без наследования их базового класса, но я не знаю как.

У меня есть базовый абстрактный класс сущности из фреймворка, подобного этому:

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 ?

Я не хочу дублировать этот класс. Извините, если это звучит глупо.

EDIT

Это проект, уже созданный с генератором кода, я не могу изменить структуру классов. По этой причине я хотел создать экземпляр этого класса без абстрактного класса.

Поскольку я не могу изменить это сейчас и нуждаюсь в этом срочно, я продублирую этот класс без абстракции и буду использовать его.

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Похоже, вам нужен интерфейс.

Извлечение интерфейса (IAbstractEntity) из AbstractEntity. Или, может быть, IContact from Contact - не очень ясно, какой класс имеет методы и свойства, которыми вы хотите поделиться. Это будет выглядеть примерно так:

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

Реализация IContact на контакт. Затем измените любые методы, которые используют только определенные методы / свойства в IContact, чтобы использовать IContact вместо Contact.

И я согласен с @ Джейми-Пенни, похоже, ты должен прочитать http://en.wikipedia.org/wiki/Data_transfer_object

Наконец, если это DTO, вам, вероятно, понадобится что-то вроде AutoMapper

1 голос
/ 24 августа 2011

Насколько я знаю, вы не можете разорвать цепь наследования. Если вы хотите, чтобы Contact не наследовал AbstractEntity, вы должны создать новый класс Contact, в котором AbstractEntity не указан как родительский.

Извините, именно так и создан C #.

0 голосов
/ 24 августа 2011

Хотя я думаю, что использование простого DTO, вероятно, было бы самым простым решением, другим вариантом было бы реализовать интерфейс IXMLSerializable в вашем классе Contact и иметь только сериализацию свойств, которые вам нужны.Конечно, это повлияет на сериализацию XML объекта и в других ситуациях, а не только с веб-службами.

0 голосов
/ 24 августа 2011

Попробуйте сдержать.

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

    public static implicit operator Contact(NotAnEntity other)
    {
        return other.Contact;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...