我上课了。在该类中,我希望使用另一个类的方法。但是,我不想仅限于一种类,我希望能够从包含该方法的任何类调用此方法。
public class DialogueSuper : MonoBehaviour
{
public choiceHandler ch = null;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void end(){
ch.next()
}
}
在end()方法中,我调用ch.next()方法。但是,我不希望被限制在一类choiceHandler中。我想在我决定传递给包含next()方法的DialogueSuper的任何类上调用next()方法。
答案 0 :(得分:2)
解决此问题的标准方法是编程到接口。 choiceHandler
可能是一个具体的类,因此问题。将其更改为包含成员IChoiceHandler
的{{1}}。
Next
任何实现接口的类都可以作为依赖项注入。
public interface IChoiceHandler
{
void Next();
}
答案 1 :(得分:1)
你所说的是控制反转。您可以通过依赖注入在代码中实现它。基本上DialogueSuper
类对象的创建者将有权选择ChoiceHandler
。您可以使用Unity应用程序块等完整的IoC提供程序,也可以自己编写。对于这种简单的需求,您可以像这样编写DialogueSuper
类:
首先,在选择处理程序类中有一个接口并实现它。
public interface IChoiceHandler
{
void Next();
}
public class ChoiceHandler : IChoiceHandler
{
public void Next() { }
}
接下来,使用以下选项之一更新对话框:
public class DialogueSuper : MonoBehaviour
{
// Way 1: Property Injection
public IChoiceHandler ChoiceHandler
{
get; set;
}
// Way 2: Constructor injection
private IChoiceHandler _choiceHandler;
private DialogueSuper() : base()
{
}
public DialogueSuper(IChoiceHandler choiceHandler)
{
_choiceHandler = choiceHandler;
}
// Way 3: Method Injection
public void end(IChoiceHandler choiceHandler)
{
// For way 1
ChoiceHandler.Next();
// For way 2
_choiceHandler.Next();
// For way 3
choiceHandler.Next();
}
}
请注意,如果您使用的是IoC提供商,则第一个选项更合适。使用当前代码,您很容易NullReferenceException
。
答案 2 :(得分:1)
您通常使用Interfaces in C#。
执行此操作接口基本上是一个合同。实现接口的所有类都必须提供在那里指定的方法和属性。
interface IChoiceHandler
{
void next();
}
接口的第一个实例
class ChoiceHandler1 : IChoiceHandler
{
public void next()
{
//do something
}
}
接口的另一个实例
class ChoiceHandler2 : IChoiceHandler
{
public void next()
{
//do something else
}
}
不,您只需要一个实现定义所需功能的接口的类。
class Example
{
public Example(IChoiceHandler handler)
{
handler.next();
}
}
也可以使用dynamics,但不推荐,因为它很容易造成运行时错误。
class Example
{
public Example(dynamic handler) => handler.next();
}