我正在用GDBdebugging一个C ++程序。 我有一个指向某个类的对象的指针。 指针被声明为一些超类,它被几个子类扩展。 在对象中没有字段来指定这个对象的精确类的types,但是一些虚函数(例如bool is_xxx())被定义为在运行时告诉类的types。 有没有一些方法可以在不调用这些虚函数的情况下告诉GDB中对象的精确类的types。 在GDB中调用这样的函数可能会在程序是multithreading时产生混乱的结果。
比方说,我有一个名为Entity的基类。 在那个类中,我有一个静态方法来检索类名: class Entity { public static String getClass() { return Entity.class.getClass(); } } 现在我有另一个课程扩展。 class User extends Entity { } 我想获得用户的类名称: System.out.println(User.getClass()); 我的目标是看到“com.packagename.User”输出到控制台,但是我将以“com.packagename.Entity”结束,因为实体类是直接从静态方法引用的。 如果这不是一个静态方法,可以通过在Entity类中使用this关键字来轻松解决(例如: return this.class.getClass() )。 但是,我需要这种方法保持静态。 有关如何解决这个问题的任何build议?
我正在阅读“深入Python”,并在这个例子中的类的章节: class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename 作者然后说,如果你想覆盖__init__方法,你必须用正确的参数显式调用父__init__ 。 如果该FileInfo类拥有多个祖先类呢? 我必须显式调用所有祖先类的__init__方法吗? 另外,我必须做到这一点,我想重写任何其他方法?
以下使用super()引发TypeError:为什么? >>> from HTMLParser import HTMLParser >>> class TextParser(HTMLParser): … def __init__(self): … super(TextParser, self).__init__() … self.all_data = [] … >>> TextParser() (…) TypeError: must be type, not classobj 在StackOverflow中有一个类似的问题: Python super()引发了TypeError ,其中的错误是由用户类不是新风格的类来解释的。 然而,上面的类是一个新的类,因为它inheritance了object : >>> isinstance(HTMLParser(), object) True 我错过了什么? 我如何使用super() ,在这里? 使用HTMLParser.__init__(self)而不是super(TextParser, self).__init__()会工作,但我想了解TypeError。 PS:Joachim指出,作为一个新式的实例并不等同于一个object 。 我读了相反的多次,因此我的困惑(基于object实例testing的新式类实例testing的示例: https : //stackoverflow.com/revisions/2655651/3 )。
为什么Pythondevise者决定,子类的__init__()方法不像其他一些语言那样自动调用其超类的__init__()方法? Pythonic和推荐的成语真的如下? class Superclass(object): def __init__(self): print 'Do something' class Subclass(Superclass): def __init__(self): super(Subclass, self).__init__() print 'Do something else'
我有两个class。 public class A { public Object method() {…} } public class B extends A { @Override public Object method() {…} } 我有一个B的实例。如何从b调用A.method()? 基本上和从B调用super.method()的效果一样。 B b = new B(); Class<?> superclass = b.getClass().getSuperclass(); Method method = superclass.getMethod("method", ArrayUtils.EMPTY_CLASS_ARRAY); Object value = method.invoke(obj, ArrayUtils.EMPTY_OBJECT_ARRAY); 但是上面的代码仍然会调用B.method()
最近我决定去看看Java,所以我还是很新的,也是面向对象编程的方法,所以我想在学习更多东西之前先弄清楚一些事情(我想这是不会很快开始的好的做法)。 我现在编程一个小2D游戏,但我认为我的问题适用于任何非平凡的项目。 为了简单,我会提供我的游戏的例子。 我有不同种类的僵尸,但他们都具有相同的属性(x,y,健康,攻击等),所以我写了一个界面僵尸,由WalkingZombie,RunningZombie TeleportingZombie等执行。这是最好的事情吗? 我更喜欢抽象类吗? 或者与一个超级class ? (我不打算部分实现函数 – 因此我select了一个接口而不是抽象类 ) 我有一个类描述主angular(幸存者),因为它是相当大的我想写一个接口与不同的function,以便我可以很容易地看到和分享它的结构。 这是好的做法吗? 还是只是浪费空间和时间? 我希望这个问题不会被认为是主观的,因为我认为有经验的程序员不会对这种话题持不同意见,因为接口/超类/抽象类的使用遵循逻辑规则,因此不是简单的个人select。
任何时候我必须重新导入我的项目到Eclipse(如果我重新安装了Eclipse,或更改了项目的位置), 几乎所有我重写的方法格式不正确,导致错误The method must override a superclass method 。 值得一提的是,这是Android项目 – 无论出于何种原因,方法参数值并不总是被填充,所以我必须自己手动填充它们。 例如: list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { //These arguments have their correct names public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { } }); 将最初像这样填充: list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { //This methods arguments were not automatically provided public void onCreateContextMenu(ContextMenu arg1, View arg2, ContextMenuInfo arg3) { } }); […]
我读了这个问题,并认为如果可以这样写的话, 这个问题很容易就可以解决了(不是不能解决的) @Override public String toString() { return super.super.toString(); } 我不确定它在很多情况下是否有用,但我想知道为什么不这样做,如果在其他语言中存在这样的情况。 你们有什么感想? 编辑:澄清:是的,我知道,这在Java中是不可能的,我真的不想错过它。 这是我所期望的工作,并感到惊讶得到一个编译器错误。 我只是有想法,想讨论一下。