2011-08-19 61 views
2
public class A 
{ 
    public int F() 
    { 
    // do something 
    } 
} 

public class B : A 
{  
    public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     b.base.F(); // this doesn't work 
     b.A.F(); // this doesn't work either 
     return b; 
    } 
} 

调用A.F()的正确语法是什么?请注意B.F()是一个静态函数。调用静态函数内部的基类过载函数?

关于编辑“改名字评论”:

请不要犯错误从此剥离下来的基本例子得出结论。实际上这些函数是用来读取XML的,所有受影响的类的函数签名是ReadXML (XmlNode parent, int id)

+0

你试过吗?((A)B).F()'?尽管我的首选解决方案是重命名其中一个F。 :) – Chris

+1

这不能被认为是超载功能的一个坏的使用? – m0skit0

+0

你不能通过这种方式调用,你应该尝试在类A中创建一个构造函数,然后在这个构造函数中调用方法F() – Gandarez

回答

3

下面将工作(测试现在这样一个正确的答案)来调用A类的F方法。

public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     ((A)b).F(); // this works 
     return b; 
    } 

您可能想考虑更改名称。我发现很难相信一个描述性的方法名称对于返回int的东西以及返回类型B的东西是一样的。也许后者应该在某处有一个Create,因为它似乎是某种工厂方法?

+0

+1为“更改名称”。 –

+0

...不知道实际应用。这个例子尽可能地减少了。 – karx11erx

+0

@ karx11erx:是的,这就是为什么我只是说你应该考虑它而不是你绝对应该。我认为它被削减了,可能会比我们看到的还多。否则,我一直在抱怨你可怕的变量和类名。 ;-) – Chris

0

我认为不可能使用任何需要使用实例/继承的关键字,例如静态方法中的basethis。由于在B类中调用F(),因此没有类B的实例,因此您不能引用任何base

正如你在B.F()创建A类的对象,并调用AF()a.F(),或者你需要F()AstaticB.F()调用A.F()的选项。

+0

'B b = new B();'会不同意你的陈述,即没有B类的实例。另外你的选项将完全改变有问题的代码。在B.F()中创建一个类A的对象将无助于创建创建的b类。并且使A中的F()成为静态将阻止它处理我假定“做某事”正在做的事件。 – Chris

+0

@Chris似乎你让我错了......你可以创建类的实例,但是你不能使用任何关键字来处理像base这样的实例... – Incognito

+0

哦,我明白你的意思了......我猜它有助于解释他为什么做不到的工作,但我仍然不认为这特别回答了这个问题。 – Chris