2013-10-16 37 views
2

我们正在使用XML,并希望在主要XML类及其所有组件之间建立一个通用接口。但是,XML类的子组件需要其他方法,但它们也需要主要组件的方法。似乎对继承有很大的用处。伪造组合和通用接口

这是我写的一些代码来完成这项任务。希望你可以得到我们根据使用情况要什么的一个好主意:

using System; 

namespace SampleNamespace 
{ 
    public class SampleClass 
    { 
     public static void Main() 
     { 

      var xmlDocumentFiles = new XmlDocumentFiles(); 

      xmlDocumentFiles.Files.RootFile.SetFileName("Example.xml"); 

      System.Console.WriteLine(
       xmlDocumentFiles.Files.RootFile.GetFileName() 
      ); 

     } 
    } 

    public class XmlDocumentFilesRoot 
    { 
     protected string _rootFileName; 

     public FilesClass Files { get { return (FilesClass) this; } } 
    } 

    public class FilesClass : XmlDocumentFilesRoot 
    { 
     public RootFileClass RootFile { get { return (RootFileClass) this; } } 
    } 

    public class RootFileClass : FilesClass 
    { 
     public void SetFileName(string newTitle) 
     { 
      _rootFileName = newTitle; 
     } 

     public string GetFileName() 
     { 
      return _rootFileName; 
     } 
    } 

    public class XmlDocumentFiles : RootFileClass 
    { 
    } 

} 

我能投给子类和我吃惊的是它运行得很好。假设除了父类中没有意义的方法以外,什么都不放在子类中,那么这个类结构会不会有任何问题(奇怪的编译错误,运行时崩溃)?

有没有其他的选择?我最初尝试位于主类之外的嵌套类+扩展方法,但是需要很多代码来设置它。请参阅:https://stackoverflow.com/questions/19415717/using-c-sharp-extension-methods-on-not-in-nested-classes-to-establish-a-common

回答

1

扩展类的功能,听起来像装饰者模式。

下面是关于这一主题的头一PDF: http://oreilly.com/catalog/hfdesignpat/chapter/ch03.pdf

也;我想劝阻三重奏'。' :

xmlDocumentFiles.Files.RootFile.SetFileName("Example.xml"); 

2是邪恶的,如果你需要3:你一定会失去可维护性。

希望它有帮助。

+0

真的吗?你知道,我并不完全不同意,但我们的希望实际上是,这种模式可以通过不用一大堆不同的方法混淆一个班级而提供一些关注的分离。 –

+0

@AlexanderPritchard:想象一下:如果你继续这种方法,你最终会使用4,5或6个点。想象一下对象返回一个'null'值,你会得到一个NullReferenceException。这在某些情况下很难调试。它可能会变得更糟:如果您在某处返回了一个IDisposable,您何时会执行该处置? ......更糟糕的是:在某个地方返回一个Com对象(我真的看到这个例子只有一次):你什么时候打电话给Marshall.Resease如果需要的话? – Stefan

+0

@AlexanderPritchard:对于装饰器模式的一个非常好的例子,请看看.net Stream类。有很多不同的类型(MemoryStream,StreamReader,StreamWriter,Images,HttpResponses等),都暴露他们自己的方法,或者实现他们自己的(例如写)覆盖。它具有类中的各种额外功能,而不会丢失基类功能。结合界面也很容易,所以你甚至不会坚持一个类的具体实现:)我真的认为你应该在这种情况下考虑这种基本模式。 – Stefan