Interfaccia o booleana?

0

Ho una classe CustomObject che ha le abilità di essere cliccabile, keypressable e mobile. Ho creato interfacce: IClickable, IKeyPressable e IMovable e ho creato diverse classi CustomObject per implementarle. Ad esempio;

public class ClickableObject: IClickable {...}
public class MovableObject: IMovable {...}
public class ClickableAndMovableObject: IClickable , IMovable {...}

Ma sto pensando ora che posso farlo con una classe e meno linee come sotto;

public class CustomObject 
{
    public bool isClickable;
    public bool isMovable;
    public bool isKeyPressable;

    // OnClick, OnMove and OnKeyPress events and other functions.
}

e usa questi valori bool se sono selezionabili o mobili ecc.

Non sono sicuro di quale sia il modo corretto di fare.

    
posta Cem 14.01.2015 - 07:32
fonte

1 risposta

4

Se le interfacce sono vuote e ti ritrovi a interrogare:

if (someObject is IClickable)
{
    ...
}

quindi queste interfacce probabilmente non sono molto utili e possono essere sostituite da valori booleani.

Se d'altra parte le interfacce contengono membri che vengono utilizzati attivamente, ad esempio:

clickableObject = someObject as IClickable;
if (clickableObject != null)
{
    clickableObject.Click(this.coordinates);
}

allora ha perfettamente senso usare le interfacce. Se hai paura della duplicazione del codice, crea una classe astratta ereditata da qualsiasi oggetto che utilizza una delle tue interfacce. In questa classe astratta, crea proprietà come:

protected bool IsClickable
{
    get
    {
        return this is IClickable;
    }
}


protected bool AsClickable
{
    get
    {
        return this as IClickable;
    }
}

o viziati con:

protected bool RunIfClickable(Action<IClickable> action)
{
    var clickable = this.AsClickable;
    if (clickable != null)
    {
        action(clickable);
    }
}

che rende l'esempio precedente facile come:

someObject.RunIfClickable(c => c.Click(this.coordinates));
    
risposta data 14.01.2015 - 07:41
fonte

Leggi altre domande sui tag