我来自C编程,所以我是OOP概念的新手。我的问题是:
我正在尝试测试一堆模块,所以我决定为常用功能编写一个包装类,所以我可以从其他类调用这些方法。但令我感到困惑的是,如果我从extends
创建其他类myWrapperClass
,我仍然不能使用包装类的方法,除非定义它们static
(并且大多数教程都说尝试如果可能,请远离静态)或者我需要使用new
创建包装类的新实例。
那么使用extends
有什么意义呢?如果这是我必须去的方式,是否有任何捷径使用它们而不是每次都写myclass.wrapperclassfunction()
?
提前致谢。
答案 0 :(得分:4)
所以我可以从其他类调用这些方法。但我困惑的地方是。如果我从myWrapperClass扩展其他类,我仍然不能使用包装类的方法,除非它们被定义为静态
这是假的。
你绝对可以这样做。
public class MyWrapperClass {
public void commonMethod() {
}
}
public class YourClass extends MyWrapperClass {
public void anotherMethod() {
commonMethod();
// other stuff
}
}
答案 1 :(得分:0)
如果通用功能在各种模块(子类)中是相同的方法,那么您可以将它从模块中分解为公共超类,并且只需将方法定义在那里。如果方法在每个子类中以不同的方式实现,但是无论您具有哪个子类实例,都希望以相同的方式调用它,那么您可以在超类中将其声明为abstract
并在每个子类中都有一个实现子类。如果它介于两者之间 - 除了几个子类之外都有相同的实现 - 那么你可以将最常见的实现分解为超类并在异常子类中覆盖它。
答案 2 :(得分:0)
[编辑OP问题摘要]:
您需要查看Java中原语和对象类型之间的区别。
可以简单地声明和使用基本类型:
int f; // Java (or is c? :)
f = 10;
必须分配对象类型。 (对于C程序员:Java对象是动态分配的。想想堆,而不是堆栈。)
Foo myFoo = new Foo(); // Java
struct foo *myFoo = (struct foo *) malloc(sizeof(struct foo)); // good old C
- 初步回答 -
你的困惑在于:
在行之间阅读,似乎你认为通过只是通知类型系统存在基类的扩展,你应该能够神奇地开始调用类型的方法。
这就是为什么你已经确定了静态方法的原因:它们不需要创建一个实例 - 显然你拒绝这样做了!
假设你有一些与Kai的答案(上面的顺序是正确的)相符的话。
然后:
/** using Kai's classes */
public void foobar() {
YourClass foo = new YourClass();
foo.commonMethod(); // try it ..
}
查看您必须知道的只需在struct
中定义和使用C
的内容。
现在忘记了这个:
typedef struct {
int foo;
char bar[3];
} extended;
extended s; // this is not just declaring s; it is also allocating it
s.foo = 10; // hey, no malloc. nasty Java insists on new ..
在Java中,当你说:
SomeClass s; // s declared but not instantiated (think 'allocated')
然后必须实例化该对象。
s = new SomeClass();
答案 3 :(得分:0)
确保在包装类中声明你的wrapperclassfunction 不是私有。
public class wrapperClasss{
private wrapperMethod(){}
}
public class Myclass extends wrapperClasss{
private myMethod(){
wrapperMethod();//this is a compile erro
}
}