Mi chiedo quanto sia costosa l'introspezione di C # in termini di controllo del tipo di classe.
Diciamo che ho un problema,
dove in un metodo di D devo decidere di agire
a seconda del tipo di oggetti diversi B:A
e C:A
.
Ora potrei farlo con l'introspezione:
public class B: A {}
public class C: A {}
public class D
{
void DoSomething()
{
A decisionCause = ...
if(decisionCause.GetType() == typeof(B)) ReactToB();
if(decisionCause.GetType() == typeof(C)) ReactToC();
}
}
Questa è una violazione del principio aperto / chiuso?
Altrimenti potrei anche fare B
e C
manipolare D
e reagire a seconda di questa manipolazione:
public class A
{
public abstract void Manipulate(A manipulating);
}
public class B: A
{
public override void Manipulate(A manipulating)
{
// manipulate in B's way
}
}
public class C: A
{
public override void Manipulate(A manipulating)
{
// manipulate in C's way
}
}
public class D
{
void DoSomething()
{
if(m_manipulated == valueSetByB) ReactToB();
if(m_manipulated == valueSetByC) ReactToC();
}
}
Tuttavia, non voglio che questi A
oggetti sappiano del tutto class D
.
Potrei anche fare qualcosa del genere:
class A
{
public readonly System.Type derivedType;
A(System.Type derivedType)
{
this.derivedType = derivedType;
}
}
class B: A
{
B(): base(typeof(B)) {};
}
class C: A
{
C(): base(typeof(C)) {};
}
public class D
{
void DoSomething()
{
A decisionCause = ...
if(decisionCause.derivedType == typeof(B)) ReactToB();
if(decisionCause.derivedType == typeof(C)) ReactToC();
}
}
Tuttavia, penso che sia una cattiva idea permettere una distinzione di tipo come questa, poiché quelli che si estendono potrebbero fare qualcosa che non è stato inteso da colui che ha implementato A.
L'introspezione è un modo ragionevole? C'è un altro modo in cui questo potrebbe essere affrontato?