在Objective-C中,您可以通过分配对象的isa成员变量来在运行时更改对象的动态类型:
id object = ...;
object->isa = [SomeClass class];
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为吗?我现在正在做这个作为其他东西的kludge,它似乎工作,但我觉得这样做很脏.我设置的新类没有添加任何成员变量,它只是覆盖一个方法并添加一个新方法,因此类大小是相同的.我觉得如果我改变了对象大小,会导致很多不好.
在C#4.0中,您可以使用"dynamic"关键字作为占位符,直到运行时才知道该类型.在某些极端情况下,这是非常有用的行为.是否有可能在C++中模拟这样的事情,可能使用C++ 0x功能或RTTI?
我一直在阅读依赖注入,控制反转和IoC容器.我还主要使用动态语言编程(PHP在工作,Python在家).以下是我找到的东西,但是当我把它拼凑在一起时,这给我留下了很多空白:
所以我读到的是:IoC容器在静态语言中是一个更大的交易,因为在动态语言中执行DI要容易得多.但是它们还提供了远远超出DI的好处,比如为您管理依赖项,并使您不必手动将十几个对象串联起来.顺便说一句,它们很复杂,所以不要自己尝试(但PHP没有好的).
我觉得这些信息让我有点......卡住了.我该怎么办?我在一个非常大的代码库中工作,具有非常复杂的依赖(并且可能强烈需要重构,但这是另一个并行问题).到目前为止,我们在实施DI方面做得很差,我真的想让我们朝着正确的方向前进.关于动态语言和IoC(或至少IoC容器)似乎没有什么.
我最好暂时将"依赖于手工"的依赖关系放在一起,并且在我更好地处理这些原则之后,担心稍后在容器中自动化它?是否值得实现我自己的简单IoC容器?或者最终是不值得PHP的成本?
我有2个java注释类型,让我们说XA和YA.两者都有一些方法().我解析源代码并检索Annotation对象.现在我想动态地将注释转换为它的真实类型,以便能够调用方法().没有instanceof声明怎么办呢?我真的想避免像开关一样的源.我需要这样的东西:
Annotation annotation = getAnnotation(); // I recieve the Annotation object here
String annotationType = annotation.annotationType().getName();
?_? myAnnotation = (Class.forName(annotationType)) annotation;
annotation.method(); // this is what I need, get the method() called
Run Code Online (Sandbox Code Playgroud)
?_?意味着我不知道什么是myAnnotation类型.我不能将基类用于我的XA和YA注释,因为不允许在注释中继承.或者有可能以某种方式做?
感谢您的任何建议或帮助.
所以我玩的是arg的类类型在运行时未知的东西.像这样:
- (NSNumber *)doWhatever:(id)arg
{
// this ALWAYS FAILS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog("arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayFromObjects:[NSNumber numberWithInt:3], nil]];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum); …Run Code Online (Sandbox Code Playgroud) types objective-c objective-c-runtime dynamic-typing nsnumber
Matlab的动态类型很弱,这就是造成这种奇怪行为的原因.我不明白的是究竟发生了什么,因为这个结果让我感到惊讶.
编辑:为了澄清,我所描述的显然是Matlab以ASCII格式存储字符的结果,这也在评论中提到.我对Matlab处理变量的方式更感兴趣,特别是它如何以及何时为值分配类型/标记.
谢谢.
'1'
Run Code Online (Sandbox Code Playgroud)
是matlab中的1乘1字符矩阵
'123'
Run Code Online (Sandbox Code Playgroud)
是一个1乘3的字符矩阵.
正如所料,
1
Run Code Online (Sandbox Code Playgroud)
返回一个1乘1.
现在,如果我进入
'1' + 1
Run Code Online (Sandbox Code Playgroud)
我得到50作为1对1的双倍,如果我进入
'123' + 1
Run Code Online (Sandbox Code Playgroud)
我得到1比3的双倍
[ 50 51 52 ]
Run Code Online (Sandbox Code Playgroud)
此外,如果我输入
'a' + 1
Run Code Online (Sandbox Code Playgroud)
结果是
98
Run Code Online (Sandbox Code Playgroud)
以1比1的双倍.
我假设这与matlab如何以ascii形式存储char变量有关,但它究竟是如何处理这些?数据是否实际上是统一的和标记的,或者它是如何工作的?
谢谢.
在Haskell中,我觉得非常漂亮的一件事是它使用Monads作为有效行为的抽象.它创建了一种非常优雅的方式来表达命令式代码,同时还允许强大的事情发生并保证正确性.
IO monad似乎并不特定于强类型语言.具体来说,在我看来,用动态类型语言实现IO monad并不困难或没有革命性.然后,只需要限制语言,以便所有IO操作只是在IO monad中生成动作.
话虽这么说,我还没有看到任何动态类型的语言(也许我只是看起来不够努力),但使用monads隔离副作用.是否有这种情况的原因?(或它们存在吗?)
我有一个名为Assembly隐藏底层产品实现的类. ProductA可以有一套吸气剂,ProductB可以有另一套吸气剂.
虽然PHP非常宽容,如果我不混淆产品和吸气剂,我的代码会起作用,但是当我搞砸并填充Assembly时ProductA,没有提供保护,但是后来使用了getter ProductB.
此外,我的IDE确实知道来自任何一个类的方法,因此当我Assembly使用其中任何一个的getter 工作时,没有提供自动完成Product.
我想要更多的防弹代码,一个Assembly 知道或知道Product它当前托管哪个子类型的代码.有办法吗?
以下示例
class Assembly
{
private $product;
public function setProduct(Product $product) {
$this->product = $product;
}
public function getA() {
return $this->product->getA();
}
public function getB() {
return $this->product->getB();
}
}
class Product { }
class ProductA extends Product
{
public function getA() {
return "A";
}
}
class ProductB extends Product
{
public …Run Code Online (Sandbox Code Playgroud) 在动态类型的 PHP 中,我们可以创建可以接受多种数据类型作为参数的函数。然后我们可以根据变量的类型对数据进行操作。有两种方法可以做到这一点:
方法一:
function doSomething1($param) {
$type = gettype($param);
if ($type === 'string') {
// do something
}
else if ($type === 'integer') {
// do something
}
else if ($type === 'array') {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
方法二:
function doSomething2($param) {
if (is_string($param)) {
// do something
}
else if (is_int($param)) {
// do something
}
else if (is_array($param)) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,从测试的角度来看,这两种方法在功能上是等效的,但是由于 PHP 有很多问题,我不得不问,如果我偏爱一种方法而不是另一种方法,我是否会错过什么?
从性能的角度来看,因为PHP 函数调用很昂贵,所以说一种方法比两种方法快是正确的吗?或者是gettype()比单个is_*() …
我开始学习Python,作为主要的Java开发人员,我遇到的最大问题是何时何时不使用类型检查.大多数人似乎都在说Python代码不需要进行类型检查,但是在我认为有必要时会有很多情况.例如,假设我需要使用方法参数来执行算术运算,为什么我不确定参数是数值数据类型?
此问题不仅限于功能.对于类变量,我也会遇到同样的思考过程.我应该或不应该使用属性(使用@property)来检查类型而不是定期实现的类变量?
这是一种为我开展发展的新方式,所以我很感激帮助理解.
dynamic-typing ×10
php ×3
objective-c ×2
types ×2
annotations ×1
c++ ×1
c++11 ×1
casting ×1
dynamic ×1
haskell ×1
java ×1
matlab ×1
monads ×1
nsnumber ×1
oop ×1
performance ×1
polymorphism ×1
python ×1
type-systems ×1