2015-11-24 4 views
0

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

private readonly List<string> fileHeaders = new List<string> 
{ 
    "Last Name", 
    "First Name", 
    "Middle Name", 
    "Suffix", 
    "Degree",   
}; 

public List<string> FileHeaders 
{ 
    get { return fileHeaders; } 
} 

Теперь у меня есть class B, что только разница в файле заголовков экспортируемых является то, что он имеет еще один заголовок столбца для экспорта, например, адрес столбца.

Что такое хороший объектно-ориентированный дизайн, который может это сделать?

+2

Сделать 'fileHeaders' защищенным членом базового класса. Пусть оба класса наследуют базовый класс, но изменяют 'fileHeaders'. –

ответ

1

Я бы предпочел это решение с интерфейсом и абстрактным базовым классом, который обеспечивает реализацию в производных классах.

Это охватывает SOLID открытого закрытого принципа

public interface IFileHeaders 
{ 
    IList<string> GetFileHeaders(); 
} 

public abstract class FileHeaderBase : IFileHeaders 
{ 
    protected abstract IList<string> FileHeaders { get; } 

    public IList<string> GetFileHeaders() => FileHeaders; 
} 

Это покрывает собой базовую реализацию:

public class FileHeaderList1 : FileHeaderBase 
{ 
    private readonly IList<string> _fileHeaders = new List<string> 
    { 
     "Last Name" , 
     "First Name" , 
     "Middle Name" , 
     "Suffix" , 
     "Degree" , 
    }; 

    protected override IList<string> FileHeaders => _fileHeaders;   
} 

Это охватывает отложенной загрузки:

public class FileHeaderList2 : FileHeaderBase 
{ 
    private IList<string> _fileHeaders; 

    protected override IList<string> FileHeaders 
    { 
     get 
     { 
      if (_fileHeaders == null) 
      { 
       _fileHeaders = new List<string> 
       { 
        "Address" , 
       }; 
      } 
      return _fileHeaders; 
     } 
    } 
} 

Это охватывает зависимость инъекций:

public class FileHeaderList3 : FileHeaderBase 
{ 
    private readonly IList<string> _fileHeaders; 

    public FileHeaderList3(IList<string> fileHeaders) 
    { 
     _fileHeaders = fileHeaders; 
    } 

    protected override IList<string> FileHeaders => _fileHeaders; 
} 
4

Сделать fileHeaders защищенным членом базового класса. Что-то вроде:

public class Base 
{ 
    protected List<string> fileHeaders; 
    public List<string> FileHeaders 
    { 
     get 
     { 
      return fileHeaders; 
     } 
    } 
} 

public class A : Base 
{ 
    public A() 
    { 
     fileHeaders = new List<string> 
     {"Last Name", "First Name", "Middle Name", "Suffix", "Degree"}; 
    } 
} 

public class B : Base 
{ 
    public B() 
    { 
     fileHeaders = new List<string> 
     {"Last Name", "First Name", "Middle Name", "Suffix", "Degree", "Something Else"}; 
    } 
} 

Вы могли бы также, если это имеет смысл (семантически), просто A быть базовым классом и имеют B наследовать, если, например, это был просто случай B имеет еще один столбец. Так что-то вроде:

public class A 
{ 
    protected readonly List<string> fileHeaders = new List<string> 
    { 
     "Last Name", "First Name", "Middle Name", "Suffix", "Degree", 
    }; 

    public List<string> FileHeaders 
    { 
     get 
     { 
      return fileHeaders; 
     } 
    } 
} 

public class B : A 
{ 
    public B() 
    { 
     fileHeaders.Add("Something Else"); 
    } 
} 
2

Поскольку оба экземпляра отличается только в данных, почему бы не создать только один класс со списком в качестве члена и только для чтения свойства (как описано выше) и отформатируйте ее с параметром в конструкторе? Нет необходимости в разных классах.

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