[编辑]
我最初的问题是“为什么要在静态和非静态之间做出决定?两者都做同样的......”
不幸的是,它被编辑为一个我真正想避免的 C# 特定问题。
所以,让我做一些补充:
当我说接口时,我指的不是 C#-keyword-interface,而是我理解的类似于 C++-interface 的东西:一组定义明确的函数来操作我的对象。当说弱化我的界面时,我的意思是我有不同的功能(静态/非静态)来做同样的事情。当有不同的功能来做同样的事情时,我的界面不再定义良好。
因此,正如管理员 Bob 所发布的,我可以实现一个 Validate() 函数
Document.Validate(myDocumentObject);
但是也
myConcreteDocumentObject.Validate();
回到我的 Copy() 示例,可以像这样实现 Copy()
myConcreteDocument.Copy(toPath);
但是也
Document.Copy(myConcreteDocumentObject, toPath)
或者
Document.Copy(fromPath, toPath)
当我想到一个包含属于我的文档的所有文件的文件夹时(在这种情况下,我不依赖于具体实例 - 但我依赖于其他事物:))。
一般来说,我说的是静态方法而不是静态类(对不起,如果我忘了提及)。
但正如 Anton Gogolev 所说,我认为我的 Document 类不是一个很好的例子,也没有很好的设计,所以我想我必须看看 Single Responsibility Principle。
我还可以实现某种与我的 DocumentClass 一起运行的 ManagerClass:
例如:
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
或者
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
但如果我参考方法 1) 我倾向于创建自己执行任务的对象,而不是创建对我的 DocumentObject 执行某些操作的其他对象 (DocumentManager) 。
(我希望这不会指向关于 OOP 的宗教讨论;)。)
[/编辑]
旧版:
起初,这似乎是一个非常基本的问题,例如“何时使用静态方法,何时不使用”,但这是我不时遇到的问题(我很难描述真正的问题是什么;也许只是为了了解为什么(不)使用 1)或为什么(不)使用 2))。
(虽然我使用的是 C#-Syntax,但这不是 C# 限制的问题)
在 OOP 中,有两种处理对象的方法(其中包括):
1)如果我想让我的对象做某事,我只是告诉他这样做:
myConcreteObject.DoSomething();
这就像和一个对象说话一样。
2) 或者,如果您喜欢静态方法:
ObjectClass.JustDoIt();
在某种程度上,我认为静态函数只是“感觉”更好。所以我倾向于经常使用静态方法(独立于具体实例——独立总是好事)。
因此,在设计课程时,我经常需要决定是采用方法 1) 还是方法 2):
想象一下,您有一个“文档”类,它应该代表应该保存到数据库中的文档:
一份文件
- 由文件系统中的一个或多个图像文件组成(这些成为单个文档页面)
- 有类似书目的东西 - 用户可以添加有关文档信息的字段 - 保存到额外的文件中
- 并且应该有一些操作,如 Copy()、AddPage()、RemovePage() 等。
现在我遇到了几种创建此类的方法:
//----- 1) non static approach/talking to objects -----
Document newDocument = new Document();
// Copy document to x (another database, for example)
newDocument.Copy(toPath);
我喜欢这样:我告诉文档将自己复制到数据库 x 并且对象自己这样做。好的。
//----- 2) static approach ----------------------------
Document.Copy(myDocumentObject, toPath);
为什么不?也不错,手感很好。。。
那么,实施哪一个呢?两个都?或者将静态方法放在一种帮助类中?还是选择方法 1) 并坚持不削弱我的 Document-class 的接口?
在考虑这两种方法时,我得出的结论是(理论上)可以将任何函数实现为静态函数:
Class.Function(aConcreteClassObject, parameters);
但也是非静态的:
aConcreteObject.DoSomething(parameters);
举一个真实的例子:
[编辑(从路径添加参数“对不起,我忘记了”)]
//----- 2) static approach ----------------------------
File.Copy(fromPath, toPath); // .Net-Framework-like
[/编辑]
但是也:
//----- 1) non static approach ------------------------
ExampeFileClass fileObject = new ExampleFileClass();
fileObject.Copy(toPath);
甚至(有点像 OOP-Overkill):
//----- 1) non static approach, too -------------------
fileObject.ToPath = @"C:\Test\file.txt"; // property of fileObject
fileObject.Copy(); // copy to toPath
那么,为什么(不)使用 1)或为什么(不)使用 2)?
(我不会过多地关注 Document 类示例,因为它更像是一个关于良好类设计的一般问题。)