JS++ 静态成员和 “应用-全局 “数据
到目前为止,我们所声明的所有字段和方法都属于类的实例。静态成员也可以被添加到一个类中。静态成员在程序开始时被初始化,对类的所有实例都可用。
举个例子,我们可能想统计一下我们有多少个 “动物 “实例。这个数据对于一个或另一个 “动物 “实例来说不应该是唯一的,它对所有的动物都应该是一样的。让我们改变Animal.jspp,用 “静态 “修饰符来实现这个目标。
external ;
module Animals
{
class Animal
{
protected varelement;
private static unsigned int count = 0;
protected Animal(string iconClassName) {
string elementHTML = makeElementHTML(iconClassName);
element =(elementHTML);
Animal.count++;
}
public static unsigned int getCount() {
return Animal.count;
}
public virtual void render() {
("#content").append(element);
}
private string makeElementHTML(string iconClassName) {
string result = '<div class="animal">';
result += '<i class="icofont ' + iconClassName + '"></i>';
result += "</div>";
return result;
}
}
}
我们在’动物’类中创建了一个新字段。’计数’。它在程序开始时被初始化为零,因为它被标记为 “静态”。从那以后,在每次调用’Animal’的构造函数时(例如通过继承),我们使用++递增运算符将’count’静态字段递增1。我们通过’Animal.count’来引用这个静态字段。实际上,我们不需要在这个程度上限定名称,可以直接在类中使用’count’,但我的目的是要说明’count’应该如何通过类的名称而不是实例来访问。最后,我们声明了一个getCount()方法,返回静态字段的值。
转到main.jspp,用jQuery将这个计数渲染到网页上。
import Animals;
external ;
Animal[] animals = [
new Cat("Kitty"),
new Cat("Kat"),
new Dog("Fido"),
new Panda(),
new Rhino()
];
foreach(Animal animal in animals) {
animal.render();
}("#content").append("<p>Number of animals: " + Animal.getCount().toString() + "</p>");
编译该项目并打开index.html。现在你应该看到你渲染的动物之后的计数。
虽然我们已经展示了声明时的静态字段初始化,但还有另一种方法来初始化我们的静态字段:静态构造函数。我们一样可以改变Animal.jspp来使用静态构造函数,如下所示。
external ;
module Animals
{
class Animal
{
protected varelement;
private static unsigned int count;
protected Animal(string iconClassName) {
string elementHTML = makeElementHTML(iconClassName);
element =(elementHTML);
Animal.count++;
}
static Animal() {
Animal.count = 0;
}
public static unsigned int getCount() {
return Animal.count;
}
public virtual void render() {
("#content").append(element);
}
private string makeElementHTML(string iconClassName) {
string result = '<div class="animal">';
result += '<i class="icofont ' + iconClassName + '"></i>';
result += "</div>";
return result;
}
}
}
静态构造函数不接受任何参数,也不能应用访问修改器。它们将在应用程序启动时运行。在上面的代码中,’count’静态字段在声明时没有被初始化。相反,我们把’count’字段的初始化移到了静态构造函数中。
JS++并不像JavaScript那样有一个 “全局范围”。相反,在JavaScript中可能泄漏到全局范围的变量,在Js++中是 “文件范围”,在它所声明的文件之外将不可用。如果你想要 “全局变量”,你可以使用静态成员实现一个更安全的子集,即 “应用-全局数据”,它同样有用,而且没有全局变量的潜在问题(例如,无意中泄露给其他程序或库)。下面是一个如何使用静态成员创建应用程序全局数据的例子。
module Application
{
class Config
{
public static string hostname = "127.0.0.1";
public static unsigned int port = 80;
}
}