我试图在java中实现一个堆栈(使用列表接口:接口列表).
我想以两种不同的方式实现它:使用组合和继承.
对于继承,到目前为止我有:
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class StackInheritance implements List {
//implement list methods
}
Run Code Online (Sandbox Code Playgroud)
对于作文,我有:
import java.util.List;
public abstract class StackComposition implements List {
// implement some standard methods
}
public class StackViaList extends StackComposition {
// implement methods that have not been implemented in the abstract
// class
}
Run Code Online (Sandbox Code Playgroud)
我很困惑从哪里开始.我之前从未使用过接口,所以我是否应该使用List方法来"模仿"堆栈,例如使用Array或ArrayList?
另外,对于合成,我不明白应该在StackComposition中使用哪些方法以及应该在StackViaList中使用什么方法.在不完全理解接口以及继承和组合之间,我有点迷失.我似乎还不能"得到它"......
任何帮助将不胜感激,谢谢!
使用MEF我可以创建并加载这样的类型:
var view = Container.GetExportedValue<MyView>();
Run Code Online (Sandbox Code Playgroud)
现在我想做的是:
Type t = typeof(MyView);
var view = Container.GetExportedValue<t>();
Run Code Online (Sandbox Code Playgroud)
(当然,类型可能包含与MyView不同的内容).
使用泛型GetExportedValue <>是不可能的 - 有没有其他方法来实现这一点?
是否有可能在不离开链的情况下将jQuery集中的元素子元素添加到集合中?
即,与离开它应该是这样的:
var set = $('.some-elements');
set.add('*', set);
// or immediate ones only
set.add(set.children());
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来做任何这些,而无需创建临时set变量:
$('.some-elements').jqMagic("*");
Run Code Online (Sandbox Code Playgroud)
(当然可以为此编写一个"jqMagic"插件.我只想确定,jQuery核心中没有这个功能.)
智慧的源头"有效的Java第二"说"赞成组合而不是继承"(第16项).现在谈到Android活动时,很容易从一个扩展,但是你打破了封装,代码可能会在超类被修改时中断.我试着写作.以下是组件Activity的代码:
public class SimpleActivity extends Activity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText("This is the Artists tab");
setContentView(textview);
}
}
Run Code Online (Sandbox Code Playgroud)
这是作文.对于每个Activity的生命周期方法,我调用了forward方法.
public class ComposedActivity extends Activity {
private SimpleActivity act;
public ComposedActivity(){
act = new SimpleActivity();
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
act.onCreate(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
但是应用程序不断崩溃:java.lang.NullPointerException.我究竟做错了什么 ?只是出于好奇而问.您建议在没有继承的情况下扩展活动?
参考以下链接:
http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques.html?page=2
代码重用的组合方法提供了比继承更强的封装,因为对后端类的更改不需要破坏任何仅依赖于前端类的代码.例如, 更改前一个示例中Fruit的peel()方法的返回类型不会强制更改Apple的界面,因此无需破坏Example2的代码.
当然如果你改变返回类型peel()(见下面的代码),这意味着getPeelCount()将无法再返回int?你不是必须改变界面,否则会得到编译器错误?
class Fruit {
// Return int number of pieces of peel that
// resulted from the peeling activity.
public int peel() {
System.out.println("Peeling is appealing.");
return 1;
}
}
class Apple {
private Fruit fruit = new Fruit();
public int peel() {
return fruit.peel();
}
}
class Example2 {
public static void main(String[] args) {
Apple apple = new Apple();
int pieces = apple.peel();
}
}
Run Code Online (Sandbox Code Playgroud) 从思考C++卷.1(P-33):
组合具有很大的灵活性.新类的成员对象通常是私有的,这使得使用该类的客户端程序员无法访问它们.这允许您在不干扰现有客户端代码的情况下更改这些成员.
您还可以在运行时更改成员对象,以动态更改程序的行为.接下来描述的继承没有这种灵活性,因为编译器必须对使用继承创建的类设置编译时限制.
我们如何在组合中的运行时更改成员对象?
写入类声明时是否包含对象?
class car
{
private:
engine obj;
}
所以,这里的类car包含类的对象engine.我们怎样才能在运行时改变它?
还是我错过了一些观点?
我试图在Go中将可变参数从一个函数传递到另一个函数.基本上是这样的:
func CustomPrint(a ...interface{}) (int, error) {
// ...
// Do something else
// ...
return fmt.Print(a)
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,它a会像切片一样打印,而不是像参数列表一样.即
fmt.Print("a", "b", "c") // Prints "a b c"
CustomPrint("a", "b", "c") // Print "[a b c]"
Run Code Online (Sandbox Code Playgroud)
知道如何实现这个吗?
我正在学习设计模式和它周围的东西(特别是SOLID和Dependency inversion原理),看起来我正在失去一些东西:
遵循DIP规则,我应该能够通过不在类(组合)中创建对象,而是将对象引用/指针发送到类构造函数(聚合)来使类不那么脆弱.但这意味着我必须在其他地方创建一个实例:因此,具有聚合的一个类越灵活,另一个类就越脆弱.
请解释一下我错在哪里.
c++ design-patterns composition aggregation dependency-inversion
所有monad文章经常陈述,monad允许你按顺序排列效果.
但是简单的构图怎么样?是不是
f x = x + 1
g x = x * 2
result = f g x
Run Code Online (Sandbox Code Playgroud)
需要g x先计算f ...?
单子会做同样的事情,但处理效果?