我真的想编写可在任何平台(PC,Linux和Mac)上运行的.NET应用程序.我并不真正关心UI功能,因为这些主要是后台服务.我听说过MONO并且它允许你编写在Mac和Linux上运行的.NET应用程序,但我希望能够编写一个应用程序,当为Windows编译时将作为服务运行,并且当编译为Linux时像UNIX等效的那样运行.我也希望能够将内容存储在注册表中并使其工作.有没有办法像这样编写真正的操作系统无关的代码?......并且不要说我应该让它在网上运行!:)
我只是想知道这是否会涉及多层间接?
替代文字http://img244.imageshack.us/img244/7371/classdiagram1.jpg
我尝试做一些解释.我的想法是,我在COM对象的顶部构建一个API,它只暴露Do和Eval方法.
以前我刚刚将一个IComObject传递给Table类并直接对其进行操作,但这意味着当我尝试测试Table类时,我已经模拟了IComObject并担心命令被发送到我的表类中的COM对象.
基本思想是我有命令运行器负责在COM对象中调用正确的命令,而Table(和其他)对象只是与命令运行器对话,而不必担心正在执行的命令.然后在我的测试中我可以这样做:
Mock<TableCommandRunner> mockrunner = new Mock<TableCommandRunner>();
mockrunner.Setup(run => run.getName("DummyTable")).Returns("FakeName");
Table table = new Table("DummyTable");
//Table.Name just calls commandrunner.getName
Assert.Equal(table.Name,"FakeName");
Run Code Online (Sandbox Code Playgroud)
是否有太多的间接层或者这样可以吗?
注意:我会有更多的类,然后只有Table,Map,Window,Object等等都可以与命令运行者交谈.
由于封装和抽象都与信息隐藏有关,我是否可以将封装理解为抽象的子集?
任何想要访问java.util.ArrayList设施的用户都必须遵守提供的使用合同java.util.List.
但是人们可以轻松地破坏这个使用合同并访问这些方法 trimToSize
public void trimToSize() { ... }
Run Code Online (Sandbox Code Playgroud)
和 ensureCapacity
public void ensureCapacity(int minCapacity) { ...}
Run Code Online (Sandbox Code Playgroud)
因为这两种方法既不会被覆盖java.util.AbstractList也不会被实现java.util.List.
那么,为什么这两个方法提供了public级别访问并打破了提供的抽象java.util.List?
我有一个名为的抽象类myClass,该类有一个名为的私有数据域x.我有一个公共getX方法和一个抽象setX方法.
我有一个名为mySubclassextends 的子类myClass.我正在尝试创建一个具体的setX方法,但代码:
public void setX() {
x = 24.99;
}
Run Code Online (Sandbox Code Playgroud)
给我一个错误,就像x私人一样.我应该将x数据字段设置为受保护的还是公共的,还是有办法x保密?
我制作了一个简单的形状程序,可以在一个内部激活一个球JPanel.我的公共类形状正在标记一个错误,说形状不是抽象的(见下面的截图)
形状不是抽象的,不重写抽象方法
actionPerformed(ActionEvent)在ActionListener
Shape.java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import javafx.event.ActionEvent;
import javax.swing.*;
public class Shape extends JPanel implements ActionListener {
Timer t = new Timer(5, this);
double x = 0;
double y = 0;
double velX = 2;
double velY = 2;
public void painComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Ellipse2D circle = new Ellipse2D.Double(x, y, 40, 40);
g2.fill(circle);
t.start();
}
public void actionPerformed(ActionEvent e) {
if (x …Run Code Online (Sandbox Code Playgroud) Application has higher precedence than abstraction.
Run Code Online (Sandbox Code Playgroud)
从这个意义上说,什么是 lambda 演算抽象?我很困惑有什么优先权?
在 Kotlin 中,您可以定义一个带有默认值的抽象函数。
这个默认值是否会被传递到实现函数,而不需要在每个实现中指定相同的默认参数?
所以特征对象不能有泛型方法——看起来不错。但在这种语言中,使用抽象机制的唯一方法是通过泛型和特征对象。这意味着对于每个特征,我必须事先决定它是否可以用作对象,并在各处使用 dyn 而不是 impl。并且它内部的所有特征都必须以相同的方式来支持这一点。这种感觉非常难看。你能提出什么建议或者告诉我为什么这样设计吗?
fn main() {}
// some abstracted thing
trait Required {
fn f(&mut self, simple: i32);
}
// this trait doesn't know that it's going to be used by DynTrait
// it just takes Required as an argument
// nothing special
trait UsedByDyn {
// this generic method doesn't allow this trait to be dyn itself
// no dyn here: we don't know about DynTrait in this scope
fn f(&mut self, another: impl Required);
}
// this …Run Code Online (Sandbox Code Playgroud) 我一直在编写代码来解析和提取机器人发送的消息中的信息。只有几种不同类型的消息,但每一种都包含我感兴趣的截然不同的信息,并且我正在努力寻找将它们作为代码中的对象进行处理的最佳方法。
如果我使用 Haskell,我只需创建一个类型Message并为每种消息定义一个定制的构造函数
data Message = Greeting Foo Bar | Warning Yadda Yadda Yadda | ...
Run Code Online (Sandbox Code Playgroud)
这是一种非常好的、干净的方式,可以将它们全部放在同一个目录下type,并且能够轻松区分消息类型。
如何以 OOP 友好(或者更好,Pythonic)的方式设计对象类来实现这一效果?我想到了两种方法,即:
定义基类Message并为每种消息对其进行子类化。优点:概念上干净。缺点:有很多样板代码,并且它并没有真正使代码变得非常可读或不同消息类之间的关系清晰。
定义一个通用类Message,它代表每种消息类型。它将有一个属性.type来区分消息类型,并且其__init__功能将相应地实例化适合于消息类型的属性。优点:编码简单,实用。缺点:让类的属性如此不可预测似乎是一种不好的做法,而且通常感觉是错误的。
但我对两者都不完全满意。虽然我意识到这只是一个小程序,但我想我将其用作了解更多有关抽象和软件架构的使用的机会。有人能给我指路吗?