Лучший вид абстракции для этой работы? - PullRequest
1 голос
/ 02 августа 2011

У меня есть класс Person с свойством, которое указывает, есть ли присоединенный объект Grid. Есть 3 типа объектов сетки. 2 из них будут иметь одинаковые свойства, а 3-й - совершенно разные.

Какой тип абстракции лучше всего использовать, чтобы свойство Grid класса Person могло принимать все 3 типа? Под этим я подразумеваю, должен ли я использовать абстрактный класс, базовый класс или интерфейс? Или мне стоит посмотреть дженерики?

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

Просто странно, что у 3-го типа сетки будут эти ненужные свойства.

Ответы [ 6 ]

4 голосов
/ 02 августа 2011

Если 3-й тип сетки имеет совершенно разные свойства, то как человек может принять их все одинаково?Вы можете только «отвлекать» общность.Вы передаете две разные вещи Персоне - так что я бы не стал абстрагировать их только потому, что они обе являются сетками.

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

Я бы определил интерфейс, который будет общим для всех трех типов сетки.

public interface IGrid
{
    // define your Grid contract here
} 

Я бы тогда создал абстрактный базовый класс, который определил бы общие для первых двух типов Grid:

public abstract class GridBase : IGrid
{
}

И выведите мои две общие сетки отсюда:

public class GridTypeA : GridBase { }
public class GridTypeB : GridBase { }

Наконец, моя третья (но совершенно другая Grid), взята из IGrid

public class ObtuseGridType : IGrid
{
}

Теперь у моего персонального объекта есть IGrid.

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

Что не так с интерфейсом, который охватывает все три типа Grid, и абстрактным классом, который реализует интерфейс и охватывает элементы, общие для первых двух?

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

Мой первый вопрос к вам: почему объект Person должен знать о сетке - для меня это звучит очень похоже на то, что вы позволяете объектам уровня домена принимать внешние факторы - возможно, пользовательский интерфейс для сетки или какой-то Концерн хранения данных.

Второй вопрос (как все говорят), есть ли причина абстрагироваться от этих трех концепций сетки? Похоже, они очень разные вещи.

Тем не менее, две модели, на которые я бы посмотрел, на вашем месте, были бы Посетитель и Стратегия .

Оба эти паттерна позволят вам абстрагироваться от конкретных деталей реализации гридов и их отношения к Человеку.

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

Не могу не подумать, что у тебя здесь большие проблемы.Предположим, что возможно иметь объект Person, который может содержать один из двух совершенно разных объектов.Весь ваш код будет выглядеть так:

if (grid is GridTypeA) {
    // do some stuff with type a
} else {
    // do some stuff with type b
}

Это именно тот тип переключения типов, который объектная ориентация должна устранить.Я посмотрю на более крупный дизайн и посмотрю, смогу ли я его улучшить.Например, почему класс Person содержит указатель Grid?Говоря как человек - вероятно, то, что вы пытаетесь смоделировать - у меня нет сетки.

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

Не знаю, почему вам нужно использовать отражение, чтобы получить тип сетки.Если вы напишите что-то вроде этого, псевдокод :

public abstract class BaseGrid {
   ... 
   ... 
   public abstract Type GetGridType();
}

public class Grid1 : BaseGrid {

   ...  
   ...
   public override Type GetGridType() {
      return typeof(Grid1 );
   }
}

public class Grid2 : BaseGrid {

   ...  
   ...
   public override Type GetGridType() {
      return typeof(Grid2 );
   }
}

У вас есть GetGridType(), и вам не нужно исправление.Возвращаемое значение этой функции может быть любым идентификатором, который вы предпочитаете, основываясь на дизайне вашего приложения, не обязательно Type.

Regards.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...