我有一个关于Java继承的问题.
我有两个班A,并B和B类,继承自答:
public class A {
public A() {
System.out.println("Hi!");
}
}
public class B extends A {
public B() {
System.out.println("Bye!");
}
public static void main(String[] args) {
B b = new B();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序B时,输出是:
Hi!
Bye!
Run Code Online (Sandbox Code Playgroud)
问:为什么构造函数的
class A调用,当我创建和对象的class B?
我知道B继承了A - 所有实例或类变量以及所有方法的所有内容,在这个意义上,B的对象具有A的所有特征以及B中定义的一些其他特征.但是,我不知道并且没有'我想象当我创建一个B类型的对象时,也会调用A的构造函数.所以写下这个:
B b = new B();
Run Code Online (Sandbox Code Playgroud)
创建两个对象 - 一个是B类,另一个是A类.
这很有趣,
有人可以解释为什么会发生这种情况吗?
这是我想做的事情:
class A {
String string
static constraints = {
string(maxSize:100)
}
}
class B extends A {
static constraints = {
string(url:true)
}
}
Run Code Online (Sandbox Code Playgroud)
所以A类应该有一些约束,B应该对同一个属性有相同的附加约束.
我无法让它工作,我可以想象它会与Table-per-Hierarchy概念发生冲突.
所以我尝试通过引入一个带有类B的约束的Command对象来解决这个问题,这些约束可以在类B的构造函数中进行验证.但似乎Command对象只能在控制器中使用(grails一直说没有.validate ()方法).
所以我的问题是:使用grails约束解决这个问题最优雅的方法是什么(不是手动重新实现验证)?可能...
编辑:我可以定义子类中的所有约束,重复父类的约束,或者根本不在父类中有约束.但是该解决方案应该适用于同一父类的多个子类(具有不同约束).
如何更改继承的依赖项属性的默认值?在我们的例子中,我们创建了一个Control的子类,默认情况下它的Focusable设置为'true'.我们希望我们的子类具有默认值'false'.
我们一直在做的只是在构造函数中将其设置为'false',但如果有人使用ClearValue,它将返回默认值,而不是构造函数中设置的值.
以下是我目前正在做的事情(这是一个带有'Foo'DP的测试控件的例子.)我不是隐藏属性的'新'的粉丝虽然感谢AddOwner,但它确实指出了到同一个共享实例所以我猜它没关系.它看起来像是继承了所有其他元数据值,所以这很好.只是想知道这是否正确?
public class TestControlBase : Control
{
public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
"Foo",
typeof(int),
typeof(TestControlBase),
new FrameworkPropertyMetadata(4) // Original default value
);
public int Foo
{
get { return (int)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
}
public class TestControl : TestControlBase
{
public static readonly new DependencyProperty FooProperty = TestControlBase.FooProperty.AddOwner(
typeof(TestControl),
new FrameworkPropertyMetadata(67) // New default for this subclass
);
}
Run Code Online (Sandbox Code Playgroud)
标记
更新中...
我认为这更好,因为它消除了"新"呼叫.您仍然可以通过基类上的FooProperty访问它,因为它使用了AddOwner.因此,它在技术上是相同的.
public class TestControl : …Run Code Online (Sandbox Code Playgroud) 我重写了equals()方法,我需要知道对象是否是Event的子类的实例(Event是超类).我想要像"obj subclassof Event"这样的东西.怎么做到这一点?
提前致谢!
在对内置类型进行子类化时,我注意到内置类型的方法的返回类型中Python 2和Python 3之间存在相当重要的区别.以下代码说明了这些集:
class MySet(set):
pass
s1 = MySet([1, 2, 3, 4, 5])
s2 = MySet([1, 2, 3, 6, 7])
print(type(s1.union(s2)))
print(type(s1.intersection(s2)))
print(type(s1.difference(s2)))
Run Code Online (Sandbox Code Playgroud)
使用Python 2,所有返回值都是类型MySet.使用Python 3,返回类型是set.我找不到任何关于结果应该是什么的文档,也没有关于Python 3中的更改的任何文档.
无论如何,我真正关心的是:在Python 3中是否有一种简单的方法可以获得Python 2中的行为,而无需重新定义内置类型的每一种方法?
我正在尝试创建类,它是SKSpriteNode的子类,我想为它添加其他属性和函数.但是在第一步中我遇到了一个错误.这是我的代码:
import SpriteKit
class Ball: SKSpriteNode {
init() {
super.init(imageNamed: "ball")
}
}
Run Code Online (Sandbox Code Playgroud)
这不是编译错误,它是运行时错误.我该如何解决?
pprint.PrettyPrinter该pprint模块的文档提到该方法PrettyPrinter.format旨在使自定义格式化成为可能.
我认为可以在子类中重写此方法,但这似乎没有提供让基类方法应用换行和缩进的方法.
我已经检查了pretty模块,看起来很有趣,但似乎没有提供一种方法来自定义其他模块的类格式而无需修改这些模块.
我认为我正在寻找的东西可以让我提供类型(或可能是函数)的映射,这些类型可以识别处理节点的例程的类型.处理节点的例程将获取一个节点并返回它的字符串表示以及子节点列表.等等.
我的目标是紧凑地打印DocBook格式的自定义格式部分xml.etree.ElementTree.
(我很惊讶没有找到更多Python支持DocBook.也许我错过了那些东西.)
我在一个名为xmlearn的客户端中构建了一些使用lxml的基本功能.例如,要转储Docbook文件,您可以:
xmlearn -i docbook_file.xml dump -f docbook -r book
Run Code Online (Sandbox Code Playgroud)
这是相当半屁股,但它让我得到了我正在寻找的信息.
xmlearn还具有其他功能,例如构建图形图像的能力以及显示XML文档中标记之间关系的转储.这些与这个问题完全无关.
您还可以执行转储到任意深度,或将XPath指定为一组起始点.XPath的东西有点过时了特定于docbook的格式,所以它并没有真正发展完善.
这仍然不是这个问题的答案.我仍然希望那里有一个可以随意定制的漂亮打印机.
我有一个NSMutableArray对象,我想添加自定义方法.我尝试了子类化NSMutableArray但是当我尝试使用count方法获取对象数时,我得到一个错误,说"只为抽象类定义了方法".为什么count方法不会被继承?
我在其他地方读到如果我想使用它们,我必须将一些NSMutableArray方法导入我的自定义类.我只想为NSMutableArray类添加一个自定义方法.我应该将NSMutableArray子类化,还是应该做其他事情?
我知道一个类可以实现多个接口,但是可以扩展多个类吗?例如,我希望我的类扩展它TransformGroup和我创建的类.这在Java中可行吗?这两个语句class X extends TransformGroup extends Y并class X extends TransformGroup, Y收到一个错误.如果不可能,为什么?TransformGroup扩展,Group但我想它也扩展,Node因为它继承了字段Node,它可以传递到需要Node对象的地方.此外,与Java中的所有类一样,它们扩展了Object类.那么为什么不能用多个类扩展呢?
那么,如果可能的话,做到这一点的正确方法是什么?如果没有,为什么以及如何解决问题呢?
我想允许使用Python 3的类型提示来接受某个类的子类.例如:
class A:
pass
class B(A):
pass
class C(A):
pass
def process_any_subclass_type_of_A(cls: A):
if cls == B:
# do something
elif cls == C:
# do something else
Run Code Online (Sandbox Code Playgroud)
现在输入以下代码时:
process_any_subclass_type_of_A(B)
Run Code Online (Sandbox Code Playgroud)
我得到一个PyCharm IDE提示'预期类型A,而不是类型[B].
如何在此处更改类型提示以接受A的任何子类型?
根据这个(https://www.python.org/dev/peps/pep-0484/#type-definition-syntax,"该参数也接受其类型是特定参数类型的子类型的表达式.") ,我明白我的解决方案(cls: A)应该有效吗?
subclass ×10
inheritance ×3
java ×3
python ×3
class ×1
cocoa-touch ×1
constraints ×1
constructor ×1
docbook ×1
equals ×1
grails ×1
instanceof ×1
ios ×1
methods ×1
objective-c ×1
pretty-print ×1
python-3.x ×1
skspritenode ×1
sprite-kit ×1
swift ×1
type-hinting ×1
wpf ×1
xml ×1