我有一个有一些功能的课程。这些功能可以归类为“NameSpace”。 我搜索一种方法将每个函数组织成一些命名空间到我的类中。 有人建议我改变方法。使用Interface而不是继承。
这里有一些可以理解的样本
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();
答案 0 :(得分:1)
问题是像Class10.Letter
这样的子类不是其父类Class10
所属的继承层次结构的一部分。
因此,Class10.Letter
不会从Class1
继承,只有Class10
继承自Class1
,因此Class10.Letter
需要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.Letter
继承,因此ClassX
需要一个实例Letter
如果它正在调用非静态函数:
public ClassX() {
new Letter(this).FunctionA();
...