这可能是一个通用的OOP问题.我想根据它们的用法在接口和抽象类之间进行一般性比较.
什么时候想要使用接口?何时想要使用抽象类?
我有一个Wicket页面类,它根据抽象方法的结果设置页面标题.
public abstract class BasicPage extends WebPage {
public BasicPage() {
add(new Label("title", getTitle()));
}
protected abstract String getTitle();
}
Run Code Online (Sandbox Code Playgroud)
NetBeans通过消息"构造函数中的可覆盖方法调用"警告我,但它应该有什么问题呢?我能想象的唯一选择是将其他抽象方法的结果传递给子类中的超级构造函数.但是很多参数很难读懂.
class A:
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
B() # output: hello
Run Code Online (Sandbox Code Playgroud)
在我使用超级构造函数的所有其他语言中隐式调用.如何在Python中调用它?我希望,super(self)但这不起作用.
在工作中,我的任务是将一堆HTML文件转换成一个简单的JSP项目.它实际上是静态的,无需编程的服务器端逻辑.我应该提到我对Java完全不熟悉.JSP文件似乎可以很容易地使用常见的包含和变量,就像PHP,但我想知道一种简单的方法来获得类似模板继承(Django样式)或至少能够有一个base.jsp文件包含页眉和页脚,所以我可以稍后插入内容.
Ben Lings似乎在这里给出了一些希望: JSP模板继承 有人可以解释如何实现这个目标吗?
鉴于我没有太多时间,我认为动态路由有点多,所以我很高兴只是让URL直接映射到.jsp文件,但我愿意接受建议.
谢谢.
编辑:我不想使用任何外部库,因为它会增加我自己和其他从事项目工作的人的学习曲线,而我所工作的公司也签约了这样做.
另一个编辑:我不确定是否JSP tags有用,因为我的内容实际上没有任何模板变量.我需要的是一种能够做到这一点的方法:
base.html:
<html><body>
{ content.body }
</body></html>
Run Code Online (Sandbox Code Playgroud)
somepage.html
<wrapper:base.html>
<h1>Welcome</h1>
</wrapper>
Run Code Online (Sandbox Code Playgroud)
输出为:
<html><body>
<h1>Welcome</h1>
</body></html>
Run Code Online (Sandbox Code Playgroud)
我认为这会给我足够的多功能性来做我需要的一切.它可以实现,includes但我需要一个顶部和一个底部包括每个包装,这是一种凌乱.
在MDN文章面向对象的Javascript简介中关于继承的部分中,我注意到他们设置了prototype.constructor:
// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;
Run Code Online (Sandbox Code Playgroud)
这有什么重要意义吗?省略它可以吗?
我正在尝试以最简单的方式定义自己的异常类,这就是我得到的:
public class MyException extends Exception {}
public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是Java编译器所说的:
cannot find symbol: constructor MyException(java.lang.String)
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,这个构造函数必须继承自己java.lang.Exception,不是吗?
考虑一下 - 基类A,继承自A的类B,继承自B的类C.什么是在构造函数中调用父类构造函数的通用方法?如果这仍然听起来太模糊,这里有一些代码.
class A(object):
def __init__(self):
print "Initialiser A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Initialiser B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Initialiser C was called"
c = C()
Run Code Online (Sandbox Code Playgroud)
这就是我现在这样做的方式.但它仍然看起来有点过于非泛型 - 您仍然必须手动传递正确的类型.
现在,我尝试使用self.__class__作为super()的第一个参数,但是,显然它不起作用 - 如果你把它放在C的构造函数中 - 公平,B的构造函数被调用.如果你在B中做同样的事情,"self"仍然指向一个C的实例,所以你最终再次调用B的构造函数(这以无限递归结束).
现在没有必要考虑钻石继承,我只想解决这个具体问题.
如何在Python中创建类或方法摘要?
我试着__new__()像这样重新定义:
class F:
def __new__(cls):
raise Exception("Unable to create an instance of abstract class %s" %cls)
Run Code Online (Sandbox Code Playgroud)
但是现在如果我创建一个G继承自F这样的类:
class G(F):
pass
Run Code Online (Sandbox Code Playgroud)
然后我也无法实例化G,因为它调用了它的超类__new__方法.
有没有更好的方法来定义抽象类?
我在我的SCSS文件中有这个:
.class-a{
display: inline-block;
//some other properties
&:hover{
color: darken(#FFFFFF, 10%);
}
}
.class-b{
//Inherite class-a here
//some properties
}
Run Code Online (Sandbox Code Playgroud)
在class-b中,我想继承所有属性和嵌套声明class-a.这是怎么做到的?我尝试使用@include class-a,但这只是在编译时抛出错误.
所以这些年来我终于停止了我的脚,并决定"正确"学习JavaScript.语言设计中最令人头疼的元素之一是它的继承实现.有Ruby经验,我很高兴看到闭包和动态打字; 但是对于我的生活来说,无法弄清楚使用其他实例进行继承的对象实例会带来什么好处.
javascript oop inheritance language-design prototype-programming
inheritance ×10
oop ×5
constructor ×3
java ×3
python ×3
class ×2
javascript ×2
abstract ×1
exception ×1
interface ×1
jsp ×1
overriding ×1
sass ×1
superclass ×1
tags ×1
templates ×1