Пример кода для начала:
internal class ClubHouse : ILeasable
{
public int Id { get; set; }
public int AreaInSquareFeet { get; set; }
}
public class Parking : ILeasable
{
public int Id { get; set; }
public int CarCapacity { get; set; }
}
internal interface ILeasable
{
int Id { get; set; }
}
class LeasableRepository
{
private List<ILeasable> _leasable = new List<ILeasable>()
{
new ClubHouse() {Id = 208, AreaInSquareFeet = 7500 },
new ShowRoom(){ Id = 202, AreaInSquareFeet = 4000 },
new Parking() {Id = 504, CarCapacity = 4},
};
private Dictionary<int, ILeasable> _leasableDictionary = new Dictionary<int, ILeasable>();
public LeasableRepository()
{
_leasableDictionary = _leasable.ToDictionary(x => x.Id, x => x);
}
public ILeasable GetLeasable(int id)
{
if (_leasableDictionary.ContainsKey(id)) return _leasableDictionary[id];
return null;
}
}
public class ChargeCalculatingFacade
{
LeasableRepository leasableRepository = new LeasableRepository();
public void ShowLeasingCharges(int id)
{
var leasable = leasableRepository.GetLeasable(id);
var leasingCharge = GetLeasingCharges(leasable);
}
private int GetLeasingCharges(ILeasable leasable)
{
// This is not possible as I can't be sure that leasable is ClubHouse
var property = (ClubHouse) leasable;
var areaInSquareFeet = property.AreaInSquareFeet;
return areaInSquareFeet * 10;
}
}
Теперь в классе ChargeCalculationFacade в методе ShowLeasingCharges (int id), основанном на идентификаторе, я вызвал GetLeasable (int id), который возвращает один изреализация ILeasable. Однако он возвращается в качестве интерфейса ILeasable.
Я передаю этот ILeasable частному методу GetLeasingCharges (leasable) для расчета арендных платежей на основе AreaInSquareFeet.
Теперь параметр leasable является просто ILeasable,который имеет только свойство "Id". Теперь, как определить, какая реализация класса concreat передается в качестве параметра, я могу привести его к типу AreaInSquareFeet следующим образом:
var property = (ClubHouse) leasable;
var areaInSquareFeet = property.AreaInSquareFeet;
Но приведенный выше код невозможен, так как я не уверен, что leasable это ClubHouse, так какпросто выбирает возможность аренды из словаря на основе идентификатора.
Все классы не имеют такого же дополнительного свойства. Например, у парковки есть дополнительное свойство как «CarCapacity». У меня есть 10 таких классов, теперь я не могу поставить 10, если логика проверяет, имеет ли интерфейс требуемый тип класса.
Интересно, может ли какой-либо шаблон проектирования или какой-либо принцип SOLID упростить проект.
У меня есть следующие вопросы:
- Как я могу получить areaInSquareFeet в таком случае
- Это хорошая практика - иметь интерфейс с несколькими методами и свойствами и снова иметь дополнительные открытые методы илисвойства в конкретном классе.
Примечание: я не хочу использовать отражение. Я хотел бы изменить дизайн в случае, если без отражения невозможно. Какие-нибудь дизайнерские предложения? В таком сценарии можно использовать любой шаблон дизайна? '
Спасибо. Mita