Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将函数组织到类中(按类别)_C#_Inheritance_Interface - Fatal编程技术网

C# 将函数组织到类中(按类别)

C# 将函数组织到类中(按类别),c#,inheritance,interface,C#,Inheritance,Interface,我有一个带有一些函数的类。这些函数可以在“名称空间”中进行分类。 我寻找一种方法将每个函数组织到类中的某个名称空间中。 有人建议我改变我的方法。使用接口而不是继承 这里有一些示例供您理解 public class Class1 { public string A = "A"; public string B = "B"; public int one = 1; public int two = 2; pu

我有一个带有一些函数的类。这些函数可以在“名称空间”中进行分类。 我寻找一种方法将每个函数组织到类中的某个名称空间中。 有人建议我改变我的方法。使用接口而不是继承

这里有一些示例供您理解

 public class Class1
    {
        public string A = "A";
        public string B = "B";
        public int one = 1;
        public int two = 2;

        public Printer globalPrinter;


    }

public class Class10 : Class1
{
    public class Letter
    {
        public void FunctionA()
        {
            globalPrinter.print(A);
        }
        public void FunctionB()
        {
            globalPrinter.print(B);
        }
    }

    public class Number
    {

        public void Function1()
        {
            globalPrinter.print(one);
        }
        public void Function2()
        {
            globalPrinter.print(two);
        }
    }


}

public class ClassX : Class10
{
    public ClassX()
    {
        Letter.FunctionA();
        Letter.FunctionB();
        Number.Function1();
        Number.Function2();
    }
}

var c10 = new ClassX();
这个代码不起作用。你可以看看,在样本的末尾,你会看到

  Letter.FunctionA();
  Letter.FunctionB();
  Number.Function1();
  Number.Function2();
我可以简单地把FunctionA和FunctionB放在Class10中。但是如果有100个函数。将函数分成几个类别可能更有趣

让我看看你处理这个问题的方法


我添加了一些帮助分类的项目


回答完整代码

 public class Class1
    {
        public string A = "A";
        public string B = "B";
        public int one = 1;
        public int two = 2;

        public void globalPrinter(object t)
        {
        }
    }

    public class Class10 : Class1
    {
        public class Letter
        {
            readonly Class10 parent;
            public Letter(Class10 parent)
            {
                this.parent = parent;
            }
            public void FunctionA()
            {
                parent.globalPrinter(parent.A);
            }
            public void FunctionB()
            {
                parent.globalPrinter(parent.B);
            }
        }

        public class Number
        {
               readonly Class10 parent;
               public Number(Class10 parent)
            {
                this.parent = parent;
            }
            public void Function1()
            {

                parent.globalPrinter(parent.one);
            }
            public void Function2()
            {
                parent.globalPrinter(parent.two);
            }
        }
    }

    public class ClassX : Class10
    {
        public ClassX()
        {
            new Letter(this).FunctionA();
            new Letter(this).FunctionB();
            new Number(this).Function1();
            new Number(this).Function2();                
        }
    }

    ClassX c10 = new ClassX();

问题是像
Class10.Letter
这样的子类不是其父类
Class10
所属的继承层次结构的一部分

因此,
Class10。字母
不继承自
Class1
,只有
Class10
继承自
Class1
,因此
Class10。字母
需要一个
Class1
Class10
的实例,这样它就可以访问
globalPrinter

public class Class10: Class1 {
    public class Letter {
        readonly Class10 parent;
        public Letter(Class10 parent) {
            this.parent = parent;
        }
        public void FunctionA() {
            parent.globalPrinter.print(parent.A);
        }
    }
}
而且
ClassX
继承自
Class10
,因此它可以访问
Class10
函数,但它不继承自
Class10。字母
,因此
ClassX
如果调用非静态函数,则需要
Letter
的实例:

public ClassX() {
    new Letter(this).FunctionA();
    ...

您提供的示例代码有点难以理解,并且在演示所建模对象的语义方面没有做很多工作。根据您试图实现的目标,接口可能确实是答案的一部分。也就是说,如果方法的任何给定子集可以在语义上分组到特定的功能契约中。但根据提供的示例不可能知道,因为它没有有意义的上下文。您能创建一个更真实的示例并更清楚地描述这个问题吗?FunctionA()、FunctionB()和FunctionC()需要是静态的,才能在不创建类实例的情况下调用它们。Class1中的变量A和B也是如此。我更改了我的示例以了解分类的更多细节。如果您的类将有100多个函数,那么它可能有100多个。它可能会打印数字和字母。(这是一个例子)。100太多了,只是为了强调函数不止几个。我不能,函数a不能是静态的,因为它使用当前/父对象的非静态变量。好吧,你已经更改了示例,所以现在没有定义Class20。在任何情况下,如果一个函数不是静态的,你需要用new创建一个类的实例。你的权利,我更改我的示例,有人在注释中要求。是的,我的“主类”ClassX将被实例化。需要包含变量并设置globalPrinter.new答案基于新样本代码问题在ClassX之前。你不能做环球打印机;无法从其父级访问它。