一个类可以返回自己的对象.
在我的示例中,我有一个名为"Change"的类,它代表对系统的更改,我想知道它是否反对设计原则返回一个Change类型的对象或一个ArrayList,其中填充了所有最近的Change对象.
是的,一个类可以有一个返回其自身实例的方法。这是一个很常见的场景。
在 C# 中,一个示例可能是:
public class Change
{
public int ChangeID { get; set; }
private Change(int changeId)
{
ChangeID = changeId;
LoadFromDatabase();
}
private void LoadFromDatabase()
{
// TODO Perform Database load here.
}
public static Change GetChange(int changeId)
{
return new Change(changeId);
}
}
Run Code Online (Sandbox Code Playgroud)
返回的另一个原因this是你可以进行功能链接:
class foo
{
private int x;
public foo()
{
this.x = 0;
}
public foo Add(int a)
{
this.x += a;
return this;
}
public foo Subtract(int a)
{
this.x -= a;
return this;
}
public int Value
{
get { return this.x; }
}
public static void Main()
{
foo f = new foo();
f.Add(10).Add(20).Subtract(1);
System.Console.WriteLine(f.Value);
}
}
Run Code Online (Sandbox Code Playgroud)
$ ./foo.exe 29
有时间和地点进行功能链接,并不是"随时随地".但是,LINQ是一个地方的一个很好的例子,巨大的功能链中受益.
是的,它可以。事实上,这正是单例类所做的。第一次调用其类级getInstance()方法时,它会构造自己的实例并返回该实例。然后后续调用getInstance()返回已构造的实例。
您的特定情况可以使用类似的方法,但您需要某种方法来确定最近更改的列表。因此,它将需要维护自己的此类更改列表。您可以使用静态数组或更改列表来完成此操作。只需确保列表中的基础信息不会消失 - 如果您维护指向对象的指针并且这些对象已被您的客户端释放,则在 C++ 中(例如)可能会发生这种情况。
在像 Java 这样的自动垃圾收集环境中问题较少,因为当仍然存在对它的引用时,对象不会消失。
但是,您不必使用此方法。我对你所描述的内容的偏好是有两个类,变更列表和变更。当您创建更改类的实例时,请向构造函数传递一个更改列表对象(如果您不希望它与更改列表关联,则为 null),并在返回之前将更改添加到该列表中。
或者,使用一个更改列表方法,该方法本身创建更改并返回它,并为了自己的目的而记住更改。
然后,您可以查询更改列表以获取最近的更改(无论您如何定义最近的更改)。这会更灵活,因为它允许多个列表。
如果需要,您甚至可以做得太过分,允许将更改与多个更改列表相关联。