首页 > 解决方案 > C#将一个大类拆分为多个类的最佳方法是什么,因此变量将在它们之间共享

问题描述

我正在尝试找到一种方法来使用一组共享方法和变量的类。

我想创建一个或多个可以处理数据的类,格式类似于 csv 文件。我创建了一个名为“Data”的大类,它应该包含主要变量和数据。

但是,根据我在网上学习的内容,最好一节课只处理程序的一个方面。

因此,Data 类将具有实际变量,如文本、列等,以及一个常用的构造函数。

internal class Data
{
    private readonly int _id;
    protected DateTime LastUpdateTime;
    protected readonly List<Column> Columns = new List<Column>();
    protected List<string> DataText = new List<string>();
    protected string Headers;

    public Data()
    {
        _id = Global.Last();
        LastUpdateTime = DateTime.Now;
    }

    public Data(List<string> dataText, char separator, Boolean hasHeaders) : base()
    {
        DataText = dataText;
        //DataManageColumns dataManageColumns = new DataManageColumns();
        new DataManageColumns().CreateColumns();
        new DataManageSeparator().Separator = separator;

        if (hasHeaders == true)
        {
            new DataManageHeaders().SetHeaders();
            new DataManageHeaders().ExcludeHeadersFromDataText();
        }
    }

    public int GetId()
    {
        return _id;
    }
}

但是,我确实想完成工作的各个方面,例如获取实际文本,或计算列数,或节省最后一次更改的时间,或者其他任何在它自己的类中。

例子:

class DataManageColumns : Data
{
    public void CreateColumns()
    {
        for (int i = 0; i < DataText.Count; i++)
        {
            string[] splitLine = DataText[i].Split(Global.CurrentData().DataManageSeparator.Separator);

            if (i == 0)
            {
                for (int j = 0; j < splitLine.Length; j++)
                {
                    Columns.Add(new Column(j, splitLine[j]));
                }
            }
        }
    }

    public List<Column> GetColumns()
    {
        return Columns;
    }

    public void SetColumns(List<Column> newColumns)
    {
        foreach (Column column in newColumns)
            column.SetSerial(column.GetSerial());
    }
}

它继承自 Data 类,因此可以使用其变量。

但!如何从基本 Data 类或任何其他类访问 DataManageColumns 方法? 我确实尝试将它添加到 Data 中:

internal DataManageColumns DataManageColumns = new DataManageColumns();

我最初的想法是使用类似的东西:specificData.dataManageColumns.DoWhatever();

虽然它没有显示错误,但它在运行时崩溃了Stack Overflow Exception

我很快就明白了原因,并将其发布在这里以帮助其他人:新数据创建新的 ManageColumns,这需要一个新的数据,它再次创建另一个 ManageColumns 等等。

问题是,如何解决这个问题?

我尝试了什么:

我尝试使用嵌套类,嵌套类不能使用主类中的变量(除非有一种我不知道的方法)。

我考虑过创建一个部分类:但这仍然会在许多方面使用一个类,这违反了 SOLID 原则。

我尝试将子类设为静态,但使用静态使其无法继承或被继承。

我相信我不是第一个想要做这样的事情的人,而且它不应该那么难实施。但我找不到办法做到这一点。

你能帮忙吗?

谢谢你,叶甫根尼

UPD:如果可能的话,我非常喜欢从使用 Data 的子类中访问方法。

就像使用 Data 类的数据对象一样:

data.MethodFromSubClass();

标签: c#classinheritance

解决方案


但!如何从基本 Data 类或任何其他类访问 DataManageColumns 方法?

你没有。更喜欢组合而不是继承(组合 v 继承),因为 DataManageColumns 类不是 Data 类的特定类型(就像三角形是一种形状一样)。前者利用了后者,而且Data该类不需要知道任何关于DataManageColumns或使用它的任何其他类的任何信息。


推荐阅读