[编辑]
我的原始问题是“为什么要在静态和非静态之间做出决定?两者都可以做同样的事情...”
不幸的是,它被编辑成了一个特定于C#的问题,而我真正想避免这种情况。
因此,让我做一些补充:
当我说接口时,我并不是指C#关键字interface,而是我的理解类似于C++接口:一组定义良好的函数来操作我的对象。当我说削弱我的接口时,我的意思是我有不同的函数(静态/非静态)来执行相同的操作。当有不同的函数来执行相同的操作时,我的接口就不再定义良好了。
因此,正如Janitor Bob所发帖子的那样,我可以实现一个Validate()函数。
Document.Validate(myDocumentObject);
但同时也
myConcreteDocumentObject.Validate();
为了回到我的Copy()示例,可以这样实现Copy()
myConcreteDocument.Copy(toPath);
但同时也
Document.Copy(myConcreteDocumentObject, toPath)
或者Document.Copy(fromPath, toPath)
当我想到包含所有属于我的文档的文件的文件夹时(在这种情况下,我不依赖于具体的实例 - 但我依赖于其他事物 :))。
一般来说,我谈论的是静态方法而不是静态类(如果我忘记提到,抱歉)。
但正如Anton Gogolev所说,我认为我的Document类不是一个好的例子,也没有设计得很好,所以我认为我需要看一下单一职责原则。
我还可以实现某种操作我的DocumentClass的ManagerClass:
例如:
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
或者myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
在一开始,这似乎是一个非常基础的问题,例如"何时使用静态方法,何时不使用",但这是我偶尔会遇到的问题(我很难描述实际问题是什么;也许只是想知道为什么(不)使用1)或者为什么(不)使用2))。
(虽然我正在使用C#语法,但这不是一个受限于C#的问题。)
在面向对象编程中,有两种方法(除其他方法外)可以处理对象:
1)如果我希望我的对象执行某项任务,我只需告诉它执行即可:
但是,如果我参考方法1),我倾向于创建能够自己执行任务的对象,而不是由其他对象(DocumentManager)执行操作,针对我的DocumentObject执行某些操作。
(我希望这不会引起关于OOP的宗教性讨论;)
[/编辑]
myConcreteObject.DoSomething();
这就像是在与一个对象交谈。
2) 或者如果你喜欢静态方法:
ObjectClass.JustDoIt();
在某种程度上,我认为静态函数会更"顺畅"。因此,我经常使用静态方法(独立于具体实例 - 独立性总是好的)。因此,在设计一个类时,我经常需要决定采取1)或2)的方法:
假设您有一个表示应保存到数据库中的文档的类“Document”:
一个文档
- 由来自文件系统的一个或多个图像文件组成(这些文件成为单个文档页面)
- 具有类似于参考文献的东西 - 用户可以添加有关文档的信息的字段 - 这些信息将保存到额外的文件中
- 并且应该有一些操作,例如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);
为什么不呢?很不错,感觉非常方便...
那么,要实现哪个呢?都实现吗?还是把静态方法放到某种辅助类中?或者选择第一种方法并坚持使用它以不削弱我的Document类的接口?
当考虑两种方法时,我得出结论(理论上)可以将任何函数实现为静态函数:
Class.Function(aConcreteClassObject, parameters);
但也不是静态的:
aConcreteObject.DoSomething(parameters);
举个现实世界的例子:
[编辑(添加了参数fromPath“抱歉,我忘记了”)]
//----- 2) static approach ----------------------------
File.Copy(fromPath, toPath); // .Net-Framework-like
但也:
[/EDIT]
//----- 1) non static approach ------------------------
ExampeFileClass fileObject = new ExampleFileClass();
fileObject.Copy(toPath);
或者甚至(有点面向对象过度):
//----- 1) non static approach, too -------------------
fileObject.ToPath = @"C:\Test\file.txt"; // property of fileObject
fileObject.Copy(); // copy to toPath
所以,为什么要(不)使用1),或者为什么要(不)使用2)?(我不会过多关注Document类示例,因为它更多是有关良好类设计的一般问题。)