标签: subclassing

选择正确的子类以编程方式实例化

好的,上下文是一些序列化/反序列化代码,它将字节流解析为更容易使用的"对象"表示(反之亦然).

这是一个带有基本消息类的简化示例,然后根据"类型"标题,存在更多数据/函数,我们必须选择正确的子类来实例化:

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)

c++ polymorphism serialization design-patterns subclassing

6
推荐指数
2
解决办法
1837
查看次数

子类化WPF窗口

我创建了一个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

wpf subclassing

6
推荐指数
1
解决办法
2747
查看次数

你如何在Android中正确编写和使用View子类?

我正在尝试实现此处找到的解决方案之一.

我的问题是,我不确定我是否正确实现和使用我的子类.我在这里继承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>?可以吗?)如何以正确的方式使用它?

android webview subclassing android-layout

6
推荐指数
1
解决办法
2271
查看次数

Python中的子类和内置方法

为方便起见,我想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函数的对象."

我的问题:无论如何都要在子类化时覆盖内置方法?

[编辑]第二个问题:如果没有,为什么不呢?

python subclassing

6
推荐指数
1
解决办法
1909
查看次数

如何子类化numpy.ndarray的子​​类

我正在努力子类化我自己的numpy.ndarray子类.我真的不明白问题是什么,并希望有人解释在下列情况下出了什么问题,以及如何做我正在尝试做的事情.

我想要实现的目标:

我有一个numpy.ndarry的子类,其行为符合我的要求(下面的代码中的A类).我想子类A(下面的代码中的B类),以便B包含其他信息(名称)和方法(装饰的.simple_data方法).

情况1:

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还需要一个适当处理附加参数的新 …

python numpy subclassing

6
推荐指数
1
解决办法
1577
查看次数

在Python中子类化set时定义__repr__

我正在尝试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)

python set subclassing

6
推荐指数
1
解决办法
1万
查看次数

根据Java中的子类Type定义泛型类父类方法

是否可以根据子类类型动态识别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)

提前致谢!

java generics subclassing

6
推荐指数
1
解决办法
2314
查看次数

在Swift中调用子类的getter

所以,在玩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)

properties subclassing swift

6
推荐指数
1
解决办法
605
查看次数

有没有办法在Python 3中子类化生成器?

除了显而易见的,我想我会尝试这个,以防万一:

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),那么我确实希望看到并理解它.

python generator subclassing python-3.x

6
推荐指数
1
解决办法
243
查看次数

无法创建SKSpriteNode的子类

尝试将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 sprite-kit swift

6
推荐指数
1
解决办法
132
查看次数