小编Bog*_*scu的帖子

在使用工厂模式时,我应该以任何方式避免向下转型吗?

我正在开发一个实现专有协议的服务器项目。服务器是用C++实现的工厂模式,我们现在面临着向下转型的问题。

我正在研究的协议是为自动控制慢速网络而设计的,例如RS485、ZigBee、窄带PLC 等。我们设计了工厂模式的主服务器。当接收到新帧时,我们首先识别该帧的关联设备类型,调用工厂方法生成新的“解析器”实例,并将帧分派给解析器实例。

我们的专有协议是纯二进制实现的,我们可能需要的每一个信息都记录在帧本身中,因此可以尽可能简单地定义基本接口。我们还将为我们的工厂实现自动注册方法(此处省略了与 std::map 操作相关的详细代码):

// This is our "interface" base-class
class parser
{
public:
    virtual int parse(unsigned char *) = 0;
    virtual ~parser() { }
};

// The next two classes are used for factory pattern
class instance_generator
{
public:
    virtual parser *generate() = 0;
};

class parser_factory
{
private:
    static std::map<int,instance_generator*> classDB;
public:
    static void add(int id, instance_generator &genrator);
    parser *get_instance(int id);
};

// the two template classes are implementations of "auto-regisrtation"
template <class G, int ID> …
Run Code Online (Sandbox Code Playgroud)

c++ oop downcast factory-pattern

5
推荐指数
1
解决办法
1438
查看次数

为什么我们可以将Java接口转换为*any*非final类?

import java.util.Collection;


public class Test
{
    public static void main(String[] args)
    {
        Collection c = null;
        Test s = null;

        s = (Test) c;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码示例中,我将一个集合对象转换为Test对象.(忽略空指针).Test 与Collection 无关,但该程序将通过所有编译时检查.

我想知道为什么会这样.我的假设是接口被忽略,因为它们太复杂了.它们没有通用的超类型,每个类都可以实现多个接口,因此类/接口层次结构太复杂而无法有效搜索?

除此之外,我很难过.有人知道吗?!

java interface downcast

4
推荐指数
1
解决办法
1936
查看次数

如何改变这种设计以避免垂头丧气?

假设我有一个从基类继承的对象集合.就像是...

   abstract public class Animal
    {

    }

    public class Dog :Animal
    {

    }

    class Monkey : Animal
    {

    }
Run Code Online (Sandbox Code Playgroud)

现在,我们需要喂养这些动物,但不允许他们知道如何喂养自己.如果他们可以,答案是直截了当的:

foreach( Animal a in myAnimals )
{
   a.feed();
}
Run Code Online (Sandbox Code Playgroud)

但是,他们不知道如何养活自己,所以我们想做这样的事情:

    class Program
{
    static void Main(string[] args)
    {
        List<Animal> myAnimals = new List<Animal>();

        myAnimals.Add(new Monkey());
        myAnimals.Add(new Dog());

        foreach (Animal a in myAnimals)
        {
            Program.FeedAnimal(a);
        }
    }

    void FeedAnimal(Monkey m) {
        Console.WriteLine("Fed a monkey.");
    }

    void FeedAnimal(Dog d)
    {
        Console.WriteLine("Fed a dog.");
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,这不会编译,因为它会迫使垂头丧气.

感觉好像有一个设计模式或其他一些带有泛型的解决方案可以帮助我摆脱这个问题,但我还没有把手指放在它上面.

建议?

c# design-patterns overloading downcast

3
推荐指数
1
解决办法
2556
查看次数

downcasted对象指向哪里?

public class Animal{

    int n = 5;

    public static void main(String[] args) {

        Animal a = new Animal();
        Animal ah = new Horse();
        Horse h = new Horse(); 

        System.out.println(h.n); // prints 7
        System.out.println(ah.n); // prints 5
        h = (Horse) ah;
        System.out.println(h.n); // prints 7

    }
}

class Horse extends Animal{

    int n = 7;

}
Run Code Online (Sandbox Code Playgroud)

我的问题:

为什么h.n还要打印7 h = (Horse) ah?在赋值之后它应该指向同一个ah点,n字段指向5?

java downcast

2
推荐指数
1
解决办法
87
查看次数

当组已知时,从numpy ndarray中选择行

我有一个numpy数组x和一个cls保留顺序的标签列表x,并记录每个元素x属于的类.例如,对于两个不同的类0和1:

x = [47 21 16 19 38]
cls = [0 0 1 0 1]
Run Code Online (Sandbox Code Playgroud)

意思是47, 21, 19属于一体,同样如此16, 38.

是否有一种pythonic方式从x类中选择元素?

现在我在做

for clusterId in np.unique(cls):
indices = [i for i in range(len(cls)) if cls[i]==clusterId]
print 'Class ', clusterId
for idx in indices:
    print '\t', x[idx,].tolist()
Run Code Online (Sandbox Code Playgroud)

但我无法相信没有更优雅的东西.

python numpy

2
推荐指数
1
解决办法
102
查看次数

在参考文献中突出显示某个作者

我正在尝试使用jekyll和创建引用列表jekyll-scholar。有没有办法在CSL样式文件中突出显示(粗体)某个作者的名字?有没有一种更好的方法可以达到相同的效果而无需触碰CSL样式文件?

例如(从此处开始),这将是理想的:

Zelle RM,E.de Hulster,W.Kloezen,JT Pronk和AJA van Maris。2010。在工程酿酒酵母菌株的生物反应器分批培养中生产C4-二羧酸的关键工艺条件。应用 环境。微生物。76:744-750。

雅培DA,Zelle RM,JT Pronk和AJA van Maris。2009。酿酒酵母用于羧酸生产的代谢工程:现状和挑战。FEMS酵母库。9:1123-1136。

Zelle RM,E.de Hulster,WA van Winden,P.de Waard,C.Dijkema,AA Winkler,JA Geertman,JP van Dijken,JT Pronk和AJA van Maris。2008年。酿酒酵母生产苹果酸:丙酮酸羧化,草酰乙酸还原和苹果酸出口的工程设计。应用 环境。微生物。74:2766-2777。

xml citations jekyll csl

2
推荐指数
1
解决办法
150
查看次数

正则表达式匹配科学记数法

我正在尝试匹配科学记数法中的数字(来自此处的正则表达式):

scinot = re.compile('[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)')
re.findall(scinot, 'x = 1e4')
['1e4']
re.findall(scinot, 'x = c1e4')
['1e4']
Run Code Online (Sandbox Code Playgroud)

我希望它匹配x = 1e4但不匹配x = c1e4。我应该改变什么?

更新:这里的答案有同样的问题:它错误地匹配'x = c1e4'.

python regex

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

Android Java类转换

我想知道是否有人可以为我解释关于一个类演员的事情.

我正在玩Android,我有一个名为ExApp的Application子类.

我想从我的一个活动中调用ExApp的方法,所以我这样做:

ExApp ex = ((ExApp)getapplication());
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我需要一套双括号?为什么我不能:

ExApp ex = (ExApp)getApplication();  
Run Code Online (Sandbox Code Playgroud)

?

谢谢.

java android casting downcast

0
推荐指数
1
解决办法
2264
查看次数