嵌套 class 的结构化 (C#)
Structuring for nested class (C#)
我正在画一个空白,我需要如何构建这些 类 才能得到我想要的东西 - 这是我所得到的东西的简化版本:
public abstract class DocumentBase
{
public abstract class IndexingBase
{
public string universalField;
}
public IndexingBase myIndex;
}
public class ATypeOfDocument : DocumentBase
{
public class Indexing : DocumentBase.IndexingBase
{
public string nonUniversalField;
}
public ATypeOfDocument()
{
this.myIndex = new Indexing();
}
}
这有效,除了我无法访问 nonUniversalField - 因为我正在通过 MyInstanceOfATypeOfDocument.myIndex 访问它,它被声明为 IndexingBase。我尝试在 ATypeOfDocument 中添加 'public new Indexing myIndex',但这导致了各种各样的问题(最大的问题是 ATypeOfDocument 的实例中有两个索引结构。)
我想我正在寻找的是让这段代码起作用:
ATypeOfDocument specDoc = new ATypeOfDocument();
DocumentBase baseDoc = new ATypeOfDocument();
specDoc.myIndex.nonUniversalField = "asdf";
specDoc.myIndex.universalField = "asdf";
baseDoc.myIndex.universalField = "asdf";
// ((ATypeOfDocument)baseDoc).myIndex.universalField should be "asdf"
此外,如果我遗漏任何内容或发布不正确,我深表歉意;这是我在 Stack Exchange 上的第一个问题。
您缺少另一个访问 nonUniversalField
的转换,即 myIndex
到 ATypeOfDocument.Indexing
:
((ATypeOfDocument.Indexing)((ATypeOfDocument)baseDoc).myIndex).nonUniversalField
我会从 classes 中删除 IndexingBase
和 Indexing
,它们包含在 classes 中,只是将它们分开 classes。将它们声明为嵌套 classes 会产生您要解决的问题,但您在 return 中获得什么好处?
嵌套 classes 的目的是隐藏内部 class,它是外部 class 的一个实现细节,对外部的一切都隐藏,就像 private变量和方法是隐藏的。在实践中,我认为大多数程序员并不经常使用它们。 (也许有些开发人员喜欢它们。)但是一旦它增加了复杂性并迫使您解决这样的问题,那么它就没有任何好处了。
我正在画一个空白,我需要如何构建这些 类 才能得到我想要的东西 - 这是我所得到的东西的简化版本:
public abstract class DocumentBase
{
public abstract class IndexingBase
{
public string universalField;
}
public IndexingBase myIndex;
}
public class ATypeOfDocument : DocumentBase
{
public class Indexing : DocumentBase.IndexingBase
{
public string nonUniversalField;
}
public ATypeOfDocument()
{
this.myIndex = new Indexing();
}
}
这有效,除了我无法访问 nonUniversalField - 因为我正在通过 MyInstanceOfATypeOfDocument.myIndex 访问它,它被声明为 IndexingBase。我尝试在 ATypeOfDocument 中添加 'public new Indexing myIndex',但这导致了各种各样的问题(最大的问题是 ATypeOfDocument 的实例中有两个索引结构。)
我想我正在寻找的是让这段代码起作用:
ATypeOfDocument specDoc = new ATypeOfDocument();
DocumentBase baseDoc = new ATypeOfDocument();
specDoc.myIndex.nonUniversalField = "asdf";
specDoc.myIndex.universalField = "asdf";
baseDoc.myIndex.universalField = "asdf";
// ((ATypeOfDocument)baseDoc).myIndex.universalField should be "asdf"
此外,如果我遗漏任何内容或发布不正确,我深表歉意;这是我在 Stack Exchange 上的第一个问题。
您缺少另一个访问 nonUniversalField
的转换,即 myIndex
到 ATypeOfDocument.Indexing
:
((ATypeOfDocument.Indexing)((ATypeOfDocument)baseDoc).myIndex).nonUniversalField
我会从 classes 中删除 IndexingBase
和 Indexing
,它们包含在 classes 中,只是将它们分开 classes。将它们声明为嵌套 classes 会产生您要解决的问题,但您在 return 中获得什么好处?
嵌套 classes 的目的是隐藏内部 class,它是外部 class 的一个实现细节,对外部的一切都隐藏,就像 private变量和方法是隐藏的。在实践中,我认为大多数程序员并不经常使用它们。 (也许有些开发人员喜欢它们。)但是一旦它增加了复杂性并迫使您解决这样的问题,那么它就没有任何好处了。