小编pse*_*ble的帖子

编写一个方法来接受接口类型而不是类类型

我正在尝试创建一些实现特定接口的类(在本例中XYPlottable),以及一个可以处理实现该接口的任何类的方法.

到目前为止,我有以下(有效):

public interface XYPlottable {
    public Number getXCoordinate();
    public Number getYCoordinate();
    public Number getCoordinate(String fieldName);
}

public class A implements XYPlottable {
//Implements the above interface properly
...
}

public class B implements XYPlottable {
//Implements the above interface properly
...
}
Run Code Online (Sandbox Code Playgroud)

这很好用.我还有一种方法可以尝试绘制XYPlottable的任何东西:

public static Frame createPlot(String title, String xAxisLabel, String yAxisLabel,
                               List<XYPlottable> points, boolean fitLine) {
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用上面的一个具体类,它抱怨有不兼容的类型:

List<A> values = _controller.getValues(tripName);
XYPlotter.createPlot("Plot A", "B", "C", values, false);
Run Code Online (Sandbox Code Playgroud)

这是确切的错误:

incompatible types
  required: java.util.List<XYPlottable>
  found:    java.util.List<A>
Run Code Online (Sandbox Code Playgroud)

我希望我只是有一个时刻,并且遗漏了一些非常明显的东西,但也许我对如何使用接口有误解.

java generics interface

11
推荐指数
2
解决办法
3510
查看次数

暴露多个接口的技术(通过静态创建方法)

我目前正在做一个项目,在该项目中我试图隐藏尽可能多的关于我创建的层次结构的细节。我想这样做是为了最大限度地减少用户需要了解的有关对象的信息量(并控制他们可以对对象状态执行的操作)。此外,我使用该模式来限制应用程序可以创建的对象类型,并将其限制为从工厂创建。

然而,我遇到的主要问题是我想公开几种不同类型的接口。每个接口都有我认为不应共享的附加功能,我希望将这些接口分开。最后,我不知道将来会出现哪些新界面,但我想尝试并为它们做好准备。

Weapon

public interface Weapon extends GameObject {
    Number attack();

    boolean addWeaponAttribute(WeaponAttribute attribute);
}
Run Code Online (Sandbox Code Playgroud)

Firearm

public interface Firearm extends Weapon {
    void reload(Number rounds);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是让工厂生产具有不同接口的对象的最佳方法是什么?这就是我在想“最好的”:

  1. 用户最清楚(很明显他们要求什么以及他们得到什么)
  2. 未来扩展的最佳选择(我不确定我将向该系统添加哪些新接口)。

到目前为止,这是我一直在想的:

为每个接口创建正确命名的方法

public static Firearm getFirearm(String firearmName) {
    ...
}

public static Weapon getWeapon(String weaponName) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

执行上述操作,但在单独命名的类中生成工厂

public class WeaponFactory {
    public static Weapon getWeapon(String weaponName) {
        ...
    }
}


public class FirearmFactory {    
    public static Firearm getFirearm(String firearmName) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

完全不同的东西

我愿意接受建议和改变。这是一个灵活的项目,因此我可以随心所欲地进行更改(就项目的这一部分而言)以取得更好的结果。

另外 - …

java design-patterns factory-pattern

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

为什么GCC不尝试内存泄漏检查?

虽然我很少再使用C了,但我一直在考虑我总是被告知的规则"如果你打电话malloc()(或new),你必须打电话free()(或delete)".它让我想知道GCC(或其他C编译器)是否尝试执行任何类型的内存并警告用户潜在的问题.我从来没有听说过,所以我怀疑情况并非如此,但我想知道.

这是我使用的例子:

#include <stdlib.h>

int main() {
  int* first = malloc(sizeof(int) *  10);
  int* second = malloc(sizeof(int) * 10);

  int i = 0;
  for (; i < 10; i++) {
    first[i] = i * 2;
    second[i] = i * 10;
  }

  free(first);  /* Forgot to free second */
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc -Wall free_test.c没有警告的情况下进行编译时生成了.虽然我可以看到为什么编译器无法提供完美的答案,因为您正在处理堆内存并在运行时管理它,为什么编译器似乎没有尝试提供可能存在内存泄漏的警告?

我对其中的一些想法包括:

  1. 编译器可能没有完美的方法来告诉内存何时被释放.例如,如果其中一个指针被传递到函数中并从函数中释放,则编译器可能无法告诉它.
  2. 如果一个不同的线程拥有内存的所有权,编译器就没有办法告诉别人可能释放内存.

c gcc memory-leaks memory-management

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

Pug - 包含嵌入 HTML 的 Markdown 文件

说到点子上了

有没有办法让 Pug 将嵌入的 HTML 作为实际 HTML 的一部分包含在 Markdown 文件中,而不仅仅是纯文本?

细节

我有一个使用jstransformer-markdown-it过滤器的 Pug 模板。输入 Markdown 文件已嵌入 HTML。那个 Markdown 文件看起来像这样 ( video.md)

# Watch this video!

This video demonstrates *the power of something something*.

<iframe width="560" height="315" src="https://www.youtube.com/..." frameborder="0" allowfullscreen></iframe>

More Markdown here.
----------------
Run Code Online (Sandbox Code Playgroud)

加载此 Markdown 文件的模板如下所示 ( entry.pug)

html
  include head.pug

  body
    header Article

    div(id="main")
      article
        include:markdown-it video.md
Run Code Online (Sandbox Code Playgroud)

然后像这样 ( index.js)通过 Express 提供。

const express = require('express');
const app = express();
app.set('view engine', 'pug');

app.get('/', …
Run Code Online (Sandbox Code Playgroud)

javascript markdown jstransform pug

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