我已经将类变量添加到深层次结构的基类中.它是一个整数,用于计算每个类类型创建的实例数.但我遇到了一个问题.
举个例子:
TBaseClass = class
private
class var fCreated: integer;
public
class function NewInstance: TObject; override;
end;
TDescendant = class(TBaseClass)
end;
...
class function TBaseClass.NewInstance: TObject;
begin
result := inherited NewInstance;
inc(fCreated);
end;
Run Code Online (Sandbox Code Playgroud)
我假设我可以使用类var来存储每个类创建的实例数,但似乎并非如此.
检查TBaseClass.fCreated
返回相同的值TDescendant.fCreated
,通过检查器更改一个更改另一个,因此它的行为就好像fCreated
是一个全局变量.
我期望fCreated
按班级类型进行维护,这不是重点吗?我错过了什么?
我已经在面向对象的PHP中完成了大量的代码,但到目前为止,我的所有类都是"单数",我想你可以调用它.我正在改变几个类(有5个左右相同的方法)来扩展一个类(以摆脱重复的代码).我遇到了一些问题.
我试图访问父类中的方法,但您可以看到问题.
家长班:
class DatabaseObject {
public static function find_all() {
return self::find_by_sql("SELECT * FROM " . self::$table_name);
}
}
Run Code Online (Sandbox Code Playgroud)
儿童班:
class Topics extends DatabaseObject {
protected static $table_name = "master_cat";
protected static $db_fields = array('cat_id', 'category');
public $cat_id;
public $category;
}
Run Code Online (Sandbox Code Playgroud)
代码尝试从php/html文件访问此表中的所有信息:
$topics=Topics::find_all();
foreach($topics as $topic):
echo $topic->category;
endforeach;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,大多数代码尚未合并到新的处理方式中.我需要更改self :: $ table_name,它不再以我正在做的新方式工作.我将有大约5个类扩展这个对象,所以最好的编码方式是什么,所以我可以用一个方法访问不同的表(而不是在5个不同的类中包含这个精确的find_all()方法.
有另一种方式只通过一个自定义类的属性没有被内置(比如迭代__dict__
,__module__
等等)?例如,在此代码中:
class Terrain:
WATER = -1
GRASS = 0
HILL = 1
MOUNTAIN = 2
Run Code Online (Sandbox Code Playgroud)
我可以遍历所有这些属性,如下所示:
for key, value in Terrain.__dict__.items():
print("{: <11}".format(key), " --> ", value)
Run Code Online (Sandbox Code Playgroud)
哪个输出:
MOUNTAIN --> 2
__module__ --> __main__
WATER --> -1
HILL --> 1
__dict__ --> <attribute '__dict__' of 'Terrain' objects>
GRASS --> 0
__weakref__ --> <attribute '__weakref__' of 'Terrain' objects>
__doc__ --> None
Run Code Online (Sandbox Code Playgroud)
如果我只想要整数参数(枚举类型的基本版本),我可以使用:
for key, value in Terrain.__dict__.items():
if type(value) is int: # type(value) == int …
Run Code Online (Sandbox Code Playgroud) 假设我可以构造一个匹配现有类的字符串,我该如何调用它?
例如,我有几个类:
我想通过构造一个匹配其名称的字符串来动态调用它们.如果他们都有方法"方法",我该如何做这样的事情?:
(1..3).each do |n|
("MyClass"+n).methods
end
Run Code Online (Sandbox Code Playgroud) 定义以下C#接口:
public interface IShape
{
int NumberOfLineSegments {get;}
int Area {get;}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我想定义几个矩形类:Trapezoid,square等.所有这些类的Area()属性都不同,但NumberOfLineSegments()总是返回4.因此,我想要一个名为Rectangle(或IRectangle)的'临时'类或接口,它看起来像:
public Rectangle : IShape
{
public int NumberOfLineSegments{get{return 4;}}
}
Run Code Online (Sandbox Code Playgroud)
我希望Rectangle只实现NumberOfLineSegment(),并将其留给派生类来实现其余的:
public Square : Rectangle
{
public int Area() {get{return length*height;}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于IShape是一个接口,Rectangle类也必须实现Area(),它不知道如何实现.因此,我似乎被卡住了,要么为Rectangle定义'dummy'Fare()方法,要么完全使用继承权.
有没有办法规避这个?我通过c#和StackOverflow在Richter的clr中广泛阅读.提前致谢!
下面是我在php中的代码,我收到错误:
解析错误:语法错误,第4行/LR_StaticSettings.php中的意外'['
<?php
class StaticSettings{
function setkey ($key, $value) {
self::arrErr[$key] = $value; // error in this line
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我想静态地使用,$this->arrErr[$key]
以便我可以在不创建实例/对象的情况下获取和设置静态属性.
为什么会出错?我们不能创建静态数组吗?
如果有其他方式,请告诉我.谢谢
我知道这种行为,但我不确定为什么会这样.
据我所知,java中的实例变量没有多态性.变量由编译器静态解析.
但在下面我对某些事感到困惑:
class Animal{
String name = "Animal";
public void display(){
System.out.println("My name is "+ name);
}
}
public class Dog extends Animal {
String name = "Dog";
public static void main(String[] args) {
Animal a = new Dog();
Dog d = new Dog();
System.out.println(a.name);//Line 1
a.display();//Line 2
d.display();//Line 3
}
}
Run Code Online (Sandbox Code Playgroud)
我认为Line 1
它会显示Animal
为静态类型a
(由编译器解析).
让我困惑的是为什么Line 3
还要展示My name is Animal
?
将尝试调用该方法,Dog
因为这是运行时的实际对象,因为它不会被覆盖,所以可以在父类中找到该方法Animal
.
我没有得到的是为什么在操作的实际对象是a时,name
在方法内部使用父类.它不隐藏父变量吗?在我看来它并不是因为类型是静态解析的.这不是oject的内存布局的一部分吗?
就像里面只有父的变量是可见的.为什么? display …
我正在学习语言,这是一个否定的怀疑.
是否可以使用虚拟朋友功能?我不知道是否可能,我甚至没有测试它,但它在某些情况下可能有用.例如,对于重载运算符<<().
DerivedClass dc;
BaseClass &rbc = dc;
cout << rbc;
Run Code Online (Sandbox Code Playgroud)
我的猜测是可能的,但我不确定,因为朋友的功能没有在类设计中实现,理论上也不是它的一部分(尽管在这个例子中,从概念上讲,运算符<<()应该是一个意义方法,但由于语法限制,不可能将其实现为一个).
编辑:我关心的是这个例子:
BaseClass bc;
DerivedClass dc;
BaseClass *pArr[2];
pArr[1] = bc;
pArr[2] = dc;
for (int i = 0; i < 2; i++)
cout << pArr[i];
Run Code Online (Sandbox Code Playgroud)
在这个混合对象数组中,我想要为每个对象调用正确的运算符<<().
由于某些原因,我们的托管公司使用PHP 5.2,甚至没有预先安装mysqli和PDO.
我别无选择,只能重写代码的某些部分,使其兼容5.2.
所以,这是我的问题:
在PHP 5.2中不支持匿名函数,所以我做了以下测试以确保我正确地更改代码:
class foo{
public function toString(){
$arr = array("a", "b");
$arr2 = array("c", "d");
print_r(array_map('mapKeyValue', $arr, $arr2));
}
private function mapKeyValue($v, $k){
return $k."='".$v."'";
}
}
$foo = new foo();
echo $foo->toString();
Run Code Online (Sandbox Code Playgroud)
但上面会给我:
Warning: array_map() expects parameter 1 to be a valid callback, function 'mapKeyValue' not found or invalid function name in ....
PHP Warning: array_map() expects parameter 1 to be a valid callback, function 'mapKeyValue' not found or invalid function name in ....
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法: …
我正在编写一个邻接矩阵R
:
neighbours <- array(0, c(100,100))
for (i in 1:100) { neighbours[i,i] = 1 } #reflexive
Run Code Online (Sandbox Code Playgroud)
但后来我发现了class(neighbours)
是double matrix
.用更大的矩阵来占用太多空间.所以我想强迫这个类型integer
,甚至更好,因为这是无向的,logical
.
但...
> class(neighbours[5])
[1] "numeric"
> class(neighbours[5]) <- "integer"
> class(neighbours[5])
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)
这不是听我的!