所以我正在编写一个应用程序,其中一个对象具有一组转发消息的委托对象.这个想法是我可以说的
someObject sendMessage:aMessage
Run Code Online (Sandbox Code Playgroud)
并且aMessage将被发送给someObject的所有委托(对于aMessage的任何值).我能够做到这一点的唯一方法是:
sendMessage:aMessage
| sel chunks kwords arglist msg |
chunks := aMessage findTokens:' '.
kwords := Array new:(chunks size).
arglist := Array new:(chunks size).
1 to: (chunks size) do: [:i |
kwords at:i put:((chunks at:i) findTokens:':') at:1.
arglist at:i put:((chunks at:i) findTokens:':') at:2].
sel := ''.
kwords do:[:word | sel := sel,word,':'].
msg := Message selector:sel arguments:arglist.
delegates do:[:del | del perform:msg selector with:msg arguments].
Run Code Online (Sandbox Code Playgroud)
它有效,但必须有更好的方法.这个解决方案将参数限制为字符串,并且只是简单的丑陋.有谁知道更清晰,更好的转发消息的方式?
顺便说一下,我正在使用吱吱声,但是首选的是独立于实现的解决方案;)
编辑:我应该补充说,委托与对象属于同一类,所以我不能只重写DoesNotUnderstand:.
abstract class db_table {
static function get_all_rows() {
...
while(...) {
$rows[] = new self();
...
}
return $rows;
}
}
class user extends db_table {
}
$rows = user::get_all_rows();
Run Code Online (Sandbox Code Playgroud)
我想从抽象父类中定义的静态方法创建类的实例,但PHP告诉我"致命错误:无法实例化抽象类......"我应该如何正确实现它?
编辑:当然我想在这种情况下创建类"user"的实例,而不是抽象类的实例.所以我要告诉它创建一个被调用的子类的实例.
所以我正在Haskell中编写一个游戏,我将玩家视为一系列与各种转弯阶段相关的状态改变函数.最初,这看起来像:
let game' = phase1 game
game'' = phase2 game'
-- etc.
Run Code Online (Sandbox Code Playgroud)
国家monadosity的主要候选人,对吧?这导致更优雅:
do
phase1
phase2
-- etc.
Run Code Online (Sandbox Code Playgroud)
然而,似乎我必须改变phase1,phase2等等以一个样板"状态获取"步骤开始:
phase1 = get >>= \game -> -- ...
Run Code Online (Sandbox Code Playgroud)
我希望有一种方法可以抽象出来,所以我可以避免调用者和被调用者都使用样板文件.我太新了,不知道这是什么方式(这是我的第一个真正的Haskell项目).有什么建议?
Spring提供了Cache Abstraction的一个有用功能
但我找不到的是提供者不可知的方式来获取实时缓存统计信息.基本上我只想在网页上或通过JMX显示所有缓存名称及其对应键的列表,其中包括命中,未命中和大小(以kb为单位).我知道ehcache确实提供了这个功能,如果我在代码中使用ehcache API,我可以得到它(过去已经使用过它).但我相信在代码中使用ehcache API会剥夺Spring框架缓存抽象的整个概念.
在谈论软件工程和抽象数据类型时,我听到了很多,这有什么作用?谁能给我一个这个概念的具体例子?
我可以在java中的抽象基类A中实现抽象方法吗?
如果答案是肯定的,并且在基类A中存在实现的抽象方法,并且存在来自A的派生类B(B不是抽象的).B仍然必须实现该基本抽象方法吗?
我知道有很多关于这个问题的帖子,它有实时例子的理论解释.这些OOP术语非常简单,但对于像我这样的初学者来说更加困惑.但我期待这里不是一个定义和实时的例子但是期待java中的代码片段.
请问任何人都可以为Java中的每一个提供非常小的代码片段,这将有助于我理解封装与信息隐藏与抽象与数据隐藏的实际关系吗?
我编写了一个Python脚本,并且发现Python 3.4并不限制抽象类在Python 2.7.8的情况下被实例化.
这是我在名为的文件中的抽象类Shape.py.
from abc import ABCMeta, abstractmethod
class Shape:
__metaclass__ = ABCMeta # Making the class abstract
def __init__(self):
pass:
@abstractmethod
def getArea(self):
print("You shouldn't have called me.")
return None
Run Code Online (Sandbox Code Playgroud)
现在我创建了另一个继承自abstract类的类Shape:
Filename:Circle.py
from Shape import Shape
class Circle(Shape):
PI = 3.141
def __init__(self, radius=0):
self.radius = radius
def getArea(self): # Overriding it from Shape class
return self.PI * self.radius ** 2
Run Code Online (Sandbox Code Playgroud)
现在在我的Main.py:
from Shape import Shape
from Circle import …Run Code Online (Sandbox Code Playgroud) 我试图理解java中数据抽象和过程抽象之间的区别。
我理解过程抽象是利用接受形式参数的方法并向用户隐藏实现。这在语言中完全有意义PL/SQL,因为我可以选择在PL/SQL.
但我对数据抽象和过程抽象感到困惑,因为即使 Java 中的过程也是作为某个类的一部分实现的。每个类还可以有一些静态方法(public static),包中的每个其他类都可以使用它们。
请有人能明确区分这两者(就java而言)
抽象是隐藏实现细节并仅向用户显示功能的过程。
另一种方式,它只向用户显示重要的东西并隐藏内部细节。所以下面是一个创建抽象类并覆盖抽象方法的示例。但我不明白的是它是如何隐藏实现细节的?
abstract class Bank
{
abstract int getRateOfInterest();
}
class SBI extends Bank
{
int getRateOfInterest()
{
return 7;
}
}
class PNB extends Bank
{
int getRateOfInterest()
{
return 8;
}
}
class TestBank{
public static void main(String args[])
{
Bank b;
b=new SBI();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
b=new PNB();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
}
}
Run Code Online (Sandbox Code Playgroud) abstraction ×10
java ×4
oop ×2
base ×1
boilerplate ×1
caching ×1
data-hiding ×1
derived ×1
haskell ×1
methods ×1
monads ×1
php ×1
python ×1
python-3.4 ×1
smalltalk ×1
spring ×1
squeak ×1
state-monad ×1
statistics ×1