好的,上下文是一些序列化/反序列化代码,它将字节流解析为更容易使用的"对象"表示(反之亦然).
这是一个带有基本消息类的简化示例,然后根据"类型"标题,存在更多数据/函数,我们必须选择正确的子类来实例化:
class BaseMessage {
public:
enum Type {
MyMessageA = 0x5a,
MyMessageB = 0xa5,
};
BaseMessage(Type type) : mType(type) { }
virtual ~BaseMessage() { }
Type type() const { return mType; }
protected:
Type mType;
virtual void parse(void *data, size_t len);
};
class MyMessageA {
public:
MyMessageA() : BaseMessage(MyMessageA) { }
/* message A specific stuf ... */
protected:
virtual void parse(void *data, size_t len);
};
class MyMessageB {
public:
MyMessageB() : BaseMessage(MyMessageB) { }
/* message B specific …Run Code Online (Sandbox Code Playgroud) 我创建了一个WPF窗口
我将其类定义修改为:
public partial class myWindow : mySubclassedWindow
Run Code Online (Sandbox Code Playgroud)
编译器抛出:
"'myWindow'的部分声明不能指定不同的基类"
myWindow.Xaml:
x:Class="WpfGridtest.myWindow"
Run Code Online (Sandbox Code Playgroud)
所以在某个地方,还有另一个部分类,它继承自"Window",但我找不到它.如何覆盖我的情况以使用子类窗口?
谢谢乔恩,这就是问题所在.还找到了这篇有用的文章:http: //geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx
我的问题是,我不确定我是否正确实现和使用我的子类.我在这里继承WebView:
public class myWebView extends WebView{
public myWebView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
// TODO Auto-generated method stub
scrollTo(xScroll - (widthScroll/2), yScroll - (heightScroll/2));
super.onSizeChanged(w, h, ow, oh);
}
}}
Run Code Online (Sandbox Code Playgroud)
它应该是私人的,但暂时忘记了.我的一个活动中的代码包含在视图层次结构中的内部webview.在该活动的onCreate方法之外.
在onCreate方法中,我有:myWebView mapImage = (myWebView) findViewById(R.id.mapcroppic);
这给了我一个ClassCastException用于该调用.(xml布局文件是否需要使用<myWebView>?可以吗?)如何以正确的方式使用它?
为方便起见,我想socket创建一个ICMP套接字子类:
class ICMPSocket(socket.socket):
def __init__(self):
socket.socket.__init__(
self,
socket.AF_INET,
socket.SOCK_RAW,
socket.getprotobyname("icmp"))
def sendto(self, data, host):
socket.socket.sendto(self, data, (host, 1))
Run Code Online (Sandbox Code Playgroud)
但是,我无法覆盖socket.sendto:
>>> s = icmp.ICMPSocket()
>>> s.sendto
<built-in method sendto of _socket.socket object at 0x100587f00>
Run Code Online (Sandbox Code Playgroud)
这是因为它sendto是一种"内置方法".根据数据模型引用,这"实际上是内置函数的不同伪装,这次包含作为隐式额外参数传递给C函数的对象."
我的问题:无论如何都要在子类化时覆盖内置方法?
[编辑]第二个问题:如果没有,为什么不呢?
我正在努力子类化我自己的numpy.ndarray子类.我真的不明白问题是什么,并希望有人解释在下列情况下出了什么问题,以及如何做我正在尝试做的事情.
我有一个numpy.ndarry的子类,其行为符合我的要求(下面的代码中的A类).我想子类A(下面的代码中的B类),以便B包含其他信息(名称)和方法(装饰的.simple_data方法).
import numpy as np
class A(np.ndarray):
def __new__(cls,data):
obj = np.asarray(data).view(cls)
return obj
def __array_finalize(self,obj):
if obj is None: return
class B(A):
def __init__(self,data,name):
super(B,self).__init__(data)
self.name = name
@property
def simple_data(self):
return [data[0,:],data[:,0]]
if __name__ == '__main__':
data = np.arange(20).reshape((4,5))
b = B(data,'B')
print type(b)
print b.simple_data
Run Code Online (Sandbox Code Playgroud)
运行此代码会生成输出:
Traceback (most recent call last):
File "ndsubclass.py", line 24, in <module>
b = B(data,'B')
TypeError: __new__() takes exactly 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)
我假设这与B的构造中的'name'变量有关,并且由于A是numpy.array的子类,因此在B的init方法之前调用A的新方法.因此,为了解决这个问题,我假设B还需要一个适当处理附加参数的新 …
我正在尝试set使用类似于下面的代码在Python中对该对象进行子类化,但是我无法找到一个合理的定义__repr__来使用.
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
Run Code Online (Sandbox Code Playgroud)
我想以__repr__这样的方式定义,我可以获得以下输出:
>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)
但是,如果我不覆盖__repr__,我得到的输出忽略了name值...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
...如果我覆盖__repr__,我无法直接访问集合中的值而无需创建新的集合实例:
class Alpha(set):
…
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, set(self))
Run Code Online (Sandbox Code Playgroud)
这是有效的,但为此创建一个新的集合实例__repr__将被处理似乎笨重和低效我.
有没有更好的方法来定义__repr__这种类?
编辑:我遇到的另一个解决方案:我可以在本地存储集合.它似乎比其他选项稍微整洁(为每次调用__repr__或使用某种形式的字符串操作创建和销毁某些东西),但对我来说似乎仍然不太理想.
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
self._set = set(s)
def __repr__(self): …Run Code Online (Sandbox Code Playgroud) 是否可以根据子类类型动态识别T作为返回类型?我想要以下内容:
public class Parent {
public <T extends Parent> T foo() {
return (T)this;
}
}
public class Child extends Parent {
public void childMethod() {
System.out.println("childMethod called");
}
}
Run Code Online (Sandbox Code Playgroud)
然后致电:
Child child = new Child();
child.foo().childMethod();
Run Code Online (Sandbox Code Playgroud)
没有像这样定义类型:
Child child = new Child();
child.foo().<Child>childMethod(); // compiles fine
Run Code Online (Sandbox Code Playgroud)
提前致谢!
所以,在玩Swift的同时,我遇到了这个问题,这令人难以置信.
我有一张卡片:
class Card {
var contents = ""
var chosen = false
var matched = false
var description: String {
get {
return self.contents
}
}
func match(otherCards: Card[]) -> Int {...}
}
Run Code Online (Sandbox Code Playgroud)
和一个子类卡的类PlayCard:
class PlayingCard: Card {
var suit: Suit
var rank: Rank
override var contents: String {
get {
return "\(rank.description())\(suit.toRaw())"
}
set { }
}
init(rank: Rank, suit: Suit) {
self.suit = suit
self.rank = rank
super.init()
}
override func match(otherCards: Card[]) -> Int {...}
} …Run Code Online (Sandbox Code Playgroud) 除了显而易见的,我想我会尝试这个,以防万一:
def somegen(input=None):
...
yield
...
gentype = type(somegen())
class subgen(gentype):
def best_function_ever():
...
Run Code Online (Sandbox Code Playgroud)
唉,Python的反应非常恶劣:
"TypeError: Type generator is not an acceptable base type"
Run Code Online (Sandbox Code Playgroud)
幸运的是,这对我来说是一个问题.看,我在想,如果我给它一个机会,它可能是一个有趣的基础类型.想象一下我的惊喜!..并且沮丧.难道没有办法让全能的Python在这个上看到我的方式吗?
这绝对是一个开箱即用的问题,所以请不要只是说如果你不能立刻想到一个方法就不可能.Python(特别是Py3)非常灵活.
当然,如果你有证据证明为什么它不能(不是"不应该")是基类型(Py3),那么我确实希望看到并理解它.
尝试将SKSpriteNode子类化,以使我的游戏代码更清晰,我显然不理解某些东西.这是一个非常简单的例子:我Alien.swift使用以下内容创建一个新的Swift文件:
import SpriteKit
class Alien: SKSpriteNode {
}
Run Code Online (Sandbox Code Playgroud)
在我的游戏中,我做:
let alienSprite: Alien = Alien()
print("It's an \(alienSprite)")
Run Code Online (Sandbox Code Playgroud)
我得到:
这是一个(SKSpriteNode)名称:'(null)......'
甚至Xcode也说它是'aliensSprite':
为什么在运行时不打印它是'alienSprite'?
编辑:在这里合并我的一条评论 - 我实际上是从我的.sks文件中获取精灵,我将它放在场景编辑器中并设置其自定义类.我尝试用以下方法来接它:
let alien = childNodeWithName("alien") as! alienSprite
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Cannot cast SKSpriteNode to alientSprite
Run Code Online (Sandbox Code Playgroud) subclassing ×10
python ×4
swift ×2
android ×1
c++ ×1
generator ×1
generics ×1
java ×1
numpy ×1
polymorphism ×1
properties ×1
python-3.x ×1
set ×1
sprite-kit ×1
webview ×1
wpf ×1