Come parte del mio lavoro su un'applicazione C # legacy, mi sono imbattuto in un nuovo (per me) uso di un'interfaccia & implementazioni concrete. Non riesco a pensare ad alcun motivo per cui dovresti fare quanto segue, ma sono abbastanza spesso, quindi forse qualcun altro può?
public interface IContract
{
ContractImplementation1 Contract { get; }
bool IsCollection { get; }
bool Touched { get; set; }
}
public class ContractImplementation1 : IContract
{
public ContractImplementation1(string propertyOne, string propertyTwo, string propertyThree, string propertyFour)
{
PropertyOne = propertyOne;
PropertyTwo = propertyTwo;
PropertyThree = propertyThree;
PropertyFour = propertyFour;
}
public ContractImplementation1 Contract { get { return this; } }
public bool IsCollection { get { return false; } }
public bool Touched { get; set; }
public string PropertyOne { get; private set; }
public string PropertyTwo { get; private set; }
public string PropertyThree { get; private set; }
public string PropertyFour { get; private set; }
public override string ToString()
{
if (string.IsNullOrEmpty(PropertyFour))
return string.Format("{0} => {1}: {2}", PropertyOne, PropertyTwo, PropertyThree);
else
return string.Format("{0} => {1}: {2} {3}", PropertyOne, PropertyTwo, PropertyThree, PropertyFour);
}
}
public class ContractImplementation2 : IContract
{
public ContractImplementation1 Contract { get { return null; } }
public bool IsCollection { get { return true; } }
public bool Touched { get; set; }
public List<ContractImplementation1> Contracts = new List<ContractImplementation1>();
}
Non riesco a capire come funziona il super-tipo con una proprietà che è un sottotipo di se stesso.
Seguendo la risposta di Cosmin: Non riesco a capire perché si dovrebbe avere il sottotipo come una proprietà dato che la proprietà si ripresenta sull'implementazione (piuttosto che un "genitore" dello stesso tipo cioè una diversa istanziazione del super-tipo).