2012-04-09 3 views
1

Скажем, у нас есть класс Картофель (и, следовательно, экземпляры), который имеет гладкость атрибута, который используется для другого метода, но не притворяется публичным. Этот атрибут устанавливается при создании экземпляра и используется только внутри экземпляра.Дизайн шаблона: Сохранить частных членов

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

Теперь возникает проблема. Мне нужно сделать объект (картофель) постоянным и сохранить его в базе данных, поэтому я должен сохранить гладкость нашего картофеля, используя класс адаптера базы данных, но .. он частный! Как я могу отправить гладкость картофеля, не делая его доступным для других целей?

Заранее спасибо

+2

Как определяется атрибут гладкости? Если он получен из других свойств, то нет необходимости его хранить. Если это не так, то откуда оно взялось? – mellamokb

+2

Реализовать аксессуар – zerkms

+0

Вы думали об использовании частного сеттера? Таким образом, гладкость не может быть установлена ​​кем-либо вне экземпляра, но может быть восстановлена. Любой класс, включая ваш адаптер базы данных, должен будет прочитать это значение, чтобы иметь возможность писать в базу данных. –

ответ

2

Напишите способ, который позволяет объекту сохранять себя, беря в качестве параметра какой-либо автор. Поскольку это база данных, вам может потребоваться как метод Insert, так и Update, а не только метод Save. Вы также можете добавить их в интерфейс.

грубый пример:

public interface IDatabaseSaveable 
{ 
    void InsertToDatabase(Database pDatabase); 
    void UpdateDatabase(Database pDatabase); 
} 

public class Potato : IDatabaseSaveable 
{ 
    private int mID; 
    private double mSmoothness; 

    public void InsertToDatabase(Database pDatabase) 
    { 
     pDatabase.InsertToPotatoes(mID, mSmoothness, ...); 
    } 

    public void UpdateDatabase(Database pDatabase) 
    { 
     pDatabase.UpdatePotatoes(mID, mSmoothness, ...); 
    } 
} 
1

Это вариация на тему, обладающее свойством гладкости, помеченный как internal. Предполагая, что картофель должен иметь набор smoothness, прежде чем вы сможете его использовать, может быть лучше внутренний конструктор. Я собираюсь принять на веру, что есть веская причина скрывать гладкость. Может быть, скромность со стороны картофеля?

public class Potato 
{ 
    internal int Smoothness { get; set; } 

    internal Potato(int smoothness) 
    { 
     this.Smoothness = smoothness; 
    } 
    private Potato() { } 
} 

только классы в той же сборке, будет иметь возможность создать экземпляр Potato, используя внутренний конструктор. И только классы в одной и той же сборке смогут получить доступ к Smoothness (чтобы они могли сохранить картофель.)

2

Вы можете создать интерфейс пару импортера/экспортер, который экстернализация «состояния» Potato без предоставления доступа к ее детали реализации (в данном случае, его частные члены и типы данных). Это типы строителей.

public class Potato { 
    public interface IExporter { 
    void AddSmoothness(string value); 
    } 
    public interface IImporter { 
    string ProvideSmoothness(); 
    } 

    public Potato(IImporter importer) { 
    this.smoothness = int.Parse(importer.ProvideSmoothness()); 
    } 

    public void Export(IExporter exporter) { 
    exporter.AddSmoothness(this.smoothness.ToString()); 
    } 

    public Potato(int smoothness) { 
    this.smoothness = smoothness; 
    } 

    private int smoothness; 
} 

Затем ваши классы адаптера базы данных реализуют соответствующие интерфейсы и используют соответствующие методы. Посмотрите here за оригинальную идею.

Смежные вопросы