class Dad
{
protected static String me = "dad";
public void printMe()
{
System.out.println(me);
}
}
class Son extends Dad
{
protected static String me = "son";
}
public void doIt()
{
new Son().printMe();
}
Run Code Online (Sandbox Code Playgroud)
功能doIt将打印"爸爸".有没有办法让它打印"儿子"?
例如,在Java中,@Override注释不仅提供了覆盖的编译时检查,而且还提供了出色的自我记录代码.
我只是在寻找文件(尽管如果它是一些像pylint这样的检查器的指示器,那就是奖金).我可以在某处添加注释或docstring,但是在Python中指示覆盖的惯用方法是什么?
为什么Python设计者决定子类的__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'
Run Code Online (Sandbox Code Playgroud) Java不允许多重继承,但它允许实现多个接口.为什么?
接口是否继承自ObjectJava中的类?
如果没有那么我们如何能够在接口实例上调用对象类的方法
public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
Run Code Online (Sandbox Code Playgroud) 关于如何在面向对象的系统中最好地扩展,增强和重用代码,有两种思路:
继承:通过创建子类来扩展类的功能.覆盖子类中的超类成员以提供新功能.当超类想要一个特定的接口但是对它的实现不可知时,使方法抽象/虚拟以强制子类"填空".
聚合:通过获取其他类并将它们组合到一个新类中来创建新功能.为这个新类附加一个公共接口,以便与其他代码进行互操作.
每个的好处,成本和后果是什么?还有其他选择吗?
我看到这个辩论定期出现,但我认为它还没有被问到Stack Overflow(虽然有一些相关的讨论).谷歌的结果也令人惊讶地缺乏.
我的代码是
public class Parent
{
public Parent(int i)
{
Console.WriteLine("parent");
}
}
public class Child : Parent
{
public Child(int i)
{
Console.WriteLine("child");
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Parent不包含带0参数的构造函数.
我理解问题是Parent没有带0参数的构造函数.但我的问题是,为什么我们需要一个零参数的构造函数?没有它,为什么代码不工作?
数据类似乎是Java中旧式POJO的替代品.很可能这些类允许继承,但我看不到扩展数据类的方便方法.我需要的是这样的:
open data class Resource (var id: Long = 0, var location: String = "")
data class Book (var isbn: String) : Resource()
Run Code Online (Sandbox Code Playgroud)
由于component1()方法的冲突,上面的代码失败了.data仅在一个类中留下注释也不起作用.
也许还有另一个成语来扩展数据类?
UPD:我可能只注释子子类,但data注释只处理构造函数中声明的属性.也就是说,我必须声明所有父级的属性open并覆盖它们,这很难看:
open class Resource (open var id: Long = 0, open var location: String = "")
data class Book (
override var id: Long = 0,
override var location: String = "",
var isbn: String
) : Resource()
Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
Run Code Online (Sandbox Code Playgroud)
所以,我想查看我的应用程序的Universe中的所有类,当我找到一个来自Animal的类时,我想创建一个该类型的新对象并将其添加到列表中.这允许我添加功能而无需更新事物列表.我可以避免以下情况:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Run Code Online (Sandbox Code Playgroud)
通过上面的方法,我可以简单地创建一个扩展Animal的新类,它将自动被拾取.
更新:2008年10月16日上午9:00太平洋标准时间:
这个问题引起了很多很好的回应 - 谢谢.从回答和我的研究中,我发现我真正想要做的就是在Java下不可能.有一些方法,比如ddimitrov的ServiceLoader机制可以工作 - 但它们对我想要的东西非常重,我相信我只是将问题从Java代码转移到外部配置文件.
另一种表达我想要的方式:我的Animal类中的静态函数查找并实例化从Animal继承的所有类 - 无需任何进一步的配置/编码.如果我必须配置,我也可以在Animal类中实例化它们.我理解,因为Java程序只是一个松散的.class文件联合体,就像它一样.
有趣的是,在C#中,这似乎相当微不足道.
我有一个包含以下事件的基类:
public event EventHandler Loading;
public event EventHandler Finished;
Run Code Online (Sandbox Code Playgroud)
在继承自此基类的类中,我尝试引发事件:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
事件'BaseClass.Loading'只能出现在+ =或 - =(BaseClass')的左侧
我假设我不能像其他继承的成员一样访问这些事件?
inheritance ×10
java ×4
c# ×2
interface ×2
oop ×2
overriding ×2
python ×2
abstract ×1
aggregation ×1
android ×1
constructor ×1
data-class ×1
delegation ×1
events ×1
kotlin ×1
reflection ×1
subclass ×1
superclass ×1