2012-01-20 3 views
1

Это своего рода вопрос ООП, ответ является хорошим для любого из C++, C#, ObjC. В приложении у меня есть следующая структура классов.Передача/создание/преобразование в подкласс/суперкласс без дублирования данных

class ToSend { 
    public int id; 
    public int prop1; 
} 

class Received : ToSend { 
    public int prop2; 
    public int prop3; 
} 

class Viewer : Received { 
    public static int viewerProp; 
    public String viewerMethod() {... Using viewerProp...} 
} 

Сбор полученного класса получен от услуги. viewerMethod (Viewer) следует использовать для отображения КАЖДЫХ элементов коллекции в списке. После множественного выбора и изменения prop1 необходимо отправить коллекцию изменений (ToSend).

Вопрос 1: Как я могу преобразовать ВСЕ экземпляры полученных в Viewer, чтобы использовать их viewerMethod? Могу ли я использовать фасад? Я не хочу копировать данные, потому что это займет слишком много места.

Вопрос 2: Как я могу преобразовать выбранные экземпляры Received to ToSend, чтобы ограничить доступные свойства? (После явного кодирования JSon-кодер будет включать все свойства Received в исходящем сообщении)

ответ

1

Возможно, вы захотите использовать композицию для зрителя, а не наследования. В конце концов, вы не сделали зритель, вы хотите использовать зрителя для просмотра данных, которые вы получили.

class Viewer 
{ 
    public Viewer(Received received) 
    { 
     this.received = received; 
    } 

    private Received received; 

    public string ViewerMethod() { ... } 
} 
3

Сначала спросите себя, является ли наследование правильным решением здесь. Общее правило состоит в том, чтобы выразить связь между двумя классами в словах.

Если вы скажете ClassA IS ClassB, то в большинстве случаев вы должны использовать наследование. Например, тигр - это млекопитающее, которое является животным. Тигр наследует все свойства, общие для всех животных, а также свойства, общие для всех млекопитающих, а также некоторые уникальные для своих видов.

Если вы скажете, что ClassA имеет класс B, то в большинстве случаев вы должны использовать композицию. Например, у Тигра есть зубы и когти. Но никто никогда не сказал бы, что Зуб - тигр, поэтому класс Зубов никогда не должен унаследовать от класса Тигра. Вместо этого он должен быть переменной-членом класса Tiger.

Если средство просмотра не является частным случаем Полученного, оно не должно наследоваться от Received.