Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UI管理框架-设计改进 我正在编写一个小的结构,作为一个处理UnyTy3D项目的2D GUI的框架。我有一个名为“UIManager”的空游戏对象,上面有“UIManager”脚本。UIManager是一个有经验的人。现在有一个问题,它适用于所有实际目的,但在设计方面,我将向世界其他地方/项目公开我的实现(它是一个单例)。我需要关于如何改进的建议,以便更好地封装_C#_Unity3d_Design Patterns_Singleton_Service Locator - Fatal编程技术网

C# UI管理框架-设计改进 我正在编写一个小的结构,作为一个处理UnyTy3D项目的2D GUI的框架。我有一个名为“UIManager”的空游戏对象,上面有“UIManager”脚本。UIManager是一个有经验的人。现在有一个问题,它适用于所有实际目的,但在设计方面,我将向世界其他地方/项目公开我的实现(它是一个单例)。我需要关于如何改进的建议,以便更好地封装

C# UI管理框架-设计改进 我正在编写一个小的结构,作为一个处理UnyTy3D项目的2D GUI的框架。我有一个名为“UIManager”的空游戏对象,上面有“UIManager”脚本。UIManager是一个有经验的人。现在有一个问题,它适用于所有实际目的,但在设计方面,我将向世界其他地方/项目公开我的实现(它是一个单例)。我需要关于如何改进的建议,以便更好地封装,c#,unity3d,design-patterns,singleton,service-locator,C#,Unity3d,Design Patterns,Singleton,Service Locator,为了更好地设计这个问题,我偶然发现了。现在我更糊涂了。如果我理解正确,我仍然将UIManager声明为singleton,但不是通过UIManager.GetInstance()之类的方式获取它的引用。。。我创建了另一个“ServiceLocator”单例,并要求它提供一个UIManager实例。我看不出它如何改进UIManager类的封装,UIManager类的实现仍然是公共的。我看不出这对解耦有什么帮助 对这个问题有什么见解吗?您希望如何操作?如果要保留访问权限,请删除公共静态引用。如果您需

为了更好地设计这个问题,我偶然发现了。现在我更糊涂了。如果我理解正确,我仍然将UIManager声明为singleton,但不是通过UIManager.GetInstance()之类的方式获取它的引用。。。我创建了另一个“ServiceLocator”单例,并要求它提供一个UIManager实例。我看不出它如何改进UIManager类的封装,UIManager类的实现仍然是公共的。我看不出这对解耦有什么帮助


对这个问题有什么见解吗?您希望如何操作?

如果要保留访问权限,请删除公共静态引用。如果您需要它,因为您的框架依赖于它,那么它可能是公共的

还可以将项目设置为完整程序集,以便公共成员可以是内部成员,并且只能从程序集中访问

您还可以使用对象使用接口来最小化可访问的内容

public interface IFirst{ void GetFirstThing(); }
public interface ISecond { void GetSecondThing(); }
public class MyClass:MonoBehaviour, IFirst, ISecond
{
    public void GetFirstThing(){}
    public void GetSecondThing(){}
}

public class ConsumerForFirstOnly
{
    private IFirst first = null;
    public ConsumerForFirstOnly(IFirst first)
    {
        this.first = first;
    }
}

现在,您的ConsumerForFirstOnly不知道类的第二部分

哦,你的意思是我将Manager类的功能划分为接口,并返回静态共享对象作为对所需接口的引用?所以我可以把经理分成ILoader和IDestructor,分别用于加载和销毁画布?太好了!这种隐藏内部实现的方法有没有名字?像是一种模式还是什么?想知道它和最简单的抽象形式(如属性获取程序等)有多大区别……我不知道它的命名。这基本上是接口的本质。如果没有名字,穿上你的。它还允许您在不更改所有框架的情况下中断manager类。假设您决定在其他地方实现ILoader,从管理器中删除该部分并将其设置在其他地方。消费者阶层不会看到不同。您还可以创建一个工厂,在该工厂中,如果有多个ILoader,参数可以定义要使用的ILoader。这并没有改变消费类。是的,这实际上是接口的简单使用。然而,我越想它,它在我的案例中似乎越来越没用了。首先,我觉得加载和销毁在大多数情况下都是同时发生的,在任何地方我都需要得到两个引用,ILoader和IDestructor。接下来,我将在vtable上消耗空间,我记得当大量使用接口导致“蹦床用完”异常时。我无法预见任何其他类会使用这些接口,这主要是丢掉了接口的美。最后,还有两个额外的类和方法签名复制。在您的例子中,加载和销毁应该是同一个接口,因为它们服务于相同的目的。我觉得在你的情况下,你要使用内部和组装。您将创建一个新的dll,添加对项目的引用,添加名称空间。现在“公共”可用,但“内部”不可见。但是,在您自己的程序集中仍然可以看到内部。结果,你只暴露你觉得相关的东西,你可以让经理在内部,不让人接触。是的,我现在明白了。谢谢