Questo è un problema comune. Di solito il problema è che la tua classe ha troppe responsabilità. Prendere in considerazione:
public interface IProjectSection
{
void DoSectionStuff()
}
public class SimpleProjectSection : IProjectSection
{
public void DoSectionStuff(){/*simple stuff here*/}
}
public class SuperiorProjectSection: IProjectSection
{
public void DoSectionStuff(){/*complex stuff here*/}
public void DoSuperiorSectionStuff(){/*additional superior stuff here*/}
}
public class ProjectSectionUser
{
public void DoSomeProjectSectionThings(IProjectSection section)
{
section.DoSectionStuff();
var superior = section as SuperiorProectSection;
if(superior != null)
superior.DoSuperiorSectionStuff();
}
}
Questo è in realtà più bello da rappresentare come due modelli di strategia, separando DoSuperiorSectionStuff () in un'altra interfaccia, in questo modo:
public interface IProjectSection
{
void DoSectionStuff();
}
public interface ISuperiorProjectSection
{
void DoSuperiorSectionStuff();
}
public class SimpleProjectSection : IProjectSection
{
public void DoSectionStuff(){/*simple stuff here*/}
}
public class SuperiorProjectSection: IProjectSection, ISuperiorProjectSection
{
public void DoSectionStuff(){/*complex stuff here*/}
public void DoSuperiorSectionStuff(){/*additional superior stuff here*/}
}
public class ProjectSectionUser
{
public void DoSomeProjectSectionThings(IProjectSection section, ISuperiorProjectSection superior)
{
section.DoSectionStuff();
superior.DoSuperiorSectionStuff();
}
}
Quindi i due modi per usarlo sono:
...
var superiorSection = new SuperiorProjectSection();
projectSectionUser.DoSomeProjectSectionThings(superiorSection, superiorsection);
...
o
...
var superiorSection = new NullSuperiorProjectSection();
var section = new SimpleProjectSection();
projectSectionUser.DoSomeProjectSectionThings(section, superiorsection);
...
dove NullSuperiorProjectSection è definito come
public class NullSuperiorProjectSection : ISuperiorProjectSection
{
public void DoSuperiorSectionStuff(){/*do nothing*/}
}
Nota: normalmente implementerei queste due interfacce in classi separate. In questo caso, non so abbastanza del tuo codice per fare un esempio decente in questo modo, quindi l'ho lasciato così. Dividere le responsabilità separate in classi separate dove ha senso; aumenta la flessibilità dei codici nel tempo.