2016-03-17 2 views
0

У меня только проблемы с учителем, и я немного смущен.Как получить всю функциональность типа, не подвергая его клиенту?

У меня есть данные, которые хранятся в VectorWithTops классе как этот

public class VectorWithTops<T> 
{ 
    private readonly Dictionary<T, int> TopsWithIndices = 
     new Dictionary<T, int>(); 
    private readonly Vector<double> _data; 

    public VectorWithTops(
     List<T> topHeaders, 
     Vector<double> data) 
     { 
      // set TopsWithIndices to be topHeaders and index in vector 
      // ... 

      _data = data 
     } 

    // method to get value in vector at certain topHeader index 
    // ... 
} 

Вся цель этого класса должен иметь возможность получить доступ к векторным индексом по его соответствующим заголовком типа T. Однако сам вектор не подвергается клиенту.

Теперь у меня есть другой класс, в котором я использую VectorWithTops, и для выполнения кучи операций над моим вектором я решил разоблачить _data в открытом методе, а затем непосредственно работать с матрицей. Я полагал, что это было хорошо, потому что _data является частным readonly, поэтому он не сможет быть изменен в любом случае.

Мой учитель вроде сошел с ума на это, и сказал мне, что я должен был сделать, это добавить операторы к моему VectorWithTops классу, например

static Vector<double> operator *(VectorWithTops<T> leftSide, Vector<double> rightSide) 
{ 
    return leftSide._data*rightSide; 
} 

Тогда я могу использовать этот статический метод, не подвергая фактической вектор клиенту. Мой вопрос тогда как эта инкапсуляция будет работать, если мне требуется большое количество методов оператора для моего вектора или матрицы? Должен ли я переписать все эти статические методы в моем собственном классе, чтобы данные обеспечивались для работы внутри моего класса? Я понимаю жалобу моего учителя на то, что вектор в моем случае разоблачен, но как я должен свободно работать с моим вектором внутри VectorWithTops?

+1

На реальном мире вы бы использовать вектор, но вы на классе, так что вы просто должны делайте все, что говорит ваш учитель, даже если это всего лишь мерзость ... – Gusman

+0

@ Гусман. Почему это мерзость, хотя его предложение? Мне кажется, есть какое-то значение, возможно, для того, чтобы не подвергать себя самому вектору? – HavelTheGreat

+0

Приговор был просто общим, а не строго об этом коде. Но вы говорите о матрицах, векторах и т. Д., Поэтому этот код пахнет какой-то 3d-программой, которая является очень вычислительной задачей, и инкапсуляция всех операторов замедляет работу, поэтому * возможно, это мерзость. – Gusman

ответ

2

В этом случае Vector<T> является неизменным типом, который даже не передается по ссылке. При условии, что ваше определение поля остается в режиме «только для чтения», нет никакой опасности подвергать его воздействию. Он не может быть изменен другим объектом без использования разведывательных хаков.

Вы могли сделать аргумент, что Vector<T> является деталью реализации конкретных, которые могут измениться в будущем, и что потребители вашего VectorsWithTops<T> класса не должны полагаться на это поле остается прежней. Но если вы не мазохист, я бы не пошел дальше, просто добавив публичный геттер/свойство для Vector<T>. Если в какой-то момент вам нужно изменить свое частное поле на другую структуру данных, публичное свойство может быть изменено в это время для выполнения преобразования.

С другой стороны, иногда просто нужно делать то, что учитель хочет передать класс ...

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