我想做这样的事情:
public interface IEquipe
{
protected abstract string EquipedText { get; }
protected abstract string EquipText { get; }
private void ChangeState(bool equipe, string name)
{
if ((!equipe && ShopData.GetInstance().IsPurchased(name)) || equipe)
{
string message = equipe ? EquipedText : EquipText;
foreach (var button in GetComponentsInChildren<Button>())
{
if (button.tag == "PriceButton")
button.enabled = !equipe;
}
foreach (var text in GetComponentsInChildren<TextMeshProUGUI>())
{
if (text.name == "PriceText")
text.text = message;
}
}
}
}
但是GetComponentsInChildren<Button>()
是一个来自Monobehavior类的方法,只有当你继承类的时候才能使用它,我能用某种方法使用它或者创建一个语句来强制实现那个接口的类也从Monobehavior继承吗?
3条答案
按热度按时间sirbozc51#
你可以使用继承了Monobehavior的类:
现在在代码中使用它
qltillow2#
如果你坚持使用默认的接口实现(尽管它有不同的用途),那么你可以做的一件事就是在你的接口中定义
GetComponentsInChildren<T>
的签名,或者更好:为MonoBehaviour方法创建一个接口,您需要频繁使用这些方法,以避免使用相同的签名将它们全部混淆。这样,从
MonoBehaviour
继承的类将自动实现GetComponentsInChildren
方法。2ic8powd3#
您不一定需要强制类继承MonoBehaviour:你只需要确保他们有一个
GetComponentsInChildren
方法。任何从
MonoBehaviour
(或者实际上是anyComponent
)派生的实现IEquipe
接口的类都将自动实现GetComponentsInChildren
成员,而不需要任何额外的代码。几个旁注:
IEquipe
的类使用它们自己的首选行为覆盖此实现。如果不希望,您可能希望将ChangeState
移到一个单独的类中--例如,它可以是静态类中的扩展方法,而不更改使用代码中的任何内容。