如何在另一个类中使用任何类型的类

时间:2018-04-23 12:59:47

标签: c# unity3d

我上课了。在该类中,我希望使用另一个类的方法。但是,我不想仅限于一种类,我希望能够从包含该方法的任何类调用此方法。

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()方法。

3 个答案:

答案 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();   
}