0

私はいくつかのプログラミング言語を知っています。それらのほとんどは、lua、perl、JS、rubyなどのスクリプト言語です。

しかし最近、私は静かに動作するJavaでプログラミングを始めました。そこで、JSにある機能を考えていました。コンストラクターのプロトタイプ、つまり。私の質問が実際に何であるかをさらに理解するために、JSで例を示します。犬のアプリケーションを作成したいとします。

function dog (){
this.property1 = value;
this.propertr2 = value2;
this.propertyN = valueN;
//etc.
}

//now, I will create several instances of the constructor in JS

var snoopy = new dog();
var buddy = new dog();

そして、JSについて私が知っている素晴らしい部分は、次のようなプロトタイプキーワードを使用して、コンストラクターとコンストラクターのすべてのインスタンス(JSで呼び出される)の情報を動的に変更できることです。

 dog.prototype.bark = function () {
 console.log("Woof!");
 };

これは、コンストラクターに関する情報を変更して、コンストラクターで作成されるすべての犬が吠える方法を知るようにするだけでなく、コンストラクターのすべてのインスタンスがプロトタイプ挿入の情報を取得するように変更します。この場合、犬に吠える方法を教えます。これは次の例で見ることができます:

var someOtherDog = new dog ();
someOtherDog.bark(); //output will be: Woof!
snoopy.bark();       //output will also be: Woof!
buddy.bark();        //you guessed it! it will also be: Woof!

したがって、JSのこのプロトタイプキーワードを使用して、コンストラクターとそのインスタンスを操作できます。さて、私の質問は:

Javaでクラスとそのインスタンスを操作するにはどうすればよいですか?そしてそれも可能ですか?そしてそうならば; Javaでそのようなことをするために私は何をすべきですか?

class dog
{
    private String hairColor;
    public dog ()
    {
        hairColor = "Brown";
    }
    public static void main (String args[])
    {
        dog snoopy = new dog ();
        dog buddy = new dog ();
        //now, how do I manipulate the class like I did in JS?
    }
}
4

3 に答える 3

1

JavaScriptでの継承は、プロトタイプチェーンによって実現されます。基本的にbark、オブジェクトでが見つからない場合はsnoopy、プロトタイプで検索されますsnoopy.prototype。そこで見つかった場合は、そのバージョンが使用されます。そうでない場合(たとえば、を呼び出す場合bark.toString())、そのメンバーを持つプロトタイプが見つかるまで、プロトタイプチェーンがトラバースされます。プロトタイプ自体はすべての「インスタンス」間で共有され、単なる通常のオブジェクトであるため、後でメンバーを追加または削除できます。

Javaの継承はクラスベースです。クラス全体を再コンパイルして再ロードしない限り、実行時にクラス定義にメンバーを追加したり、クラス定義からメンバーを削除したりすることはできません。これは異なるプログラミングパラダイムです。つまり、他の手法やパターンを使用して、(わずかに)異なる方法でプログラミングする必要があります。

于 2013-01-06T23:39:20.430 に答える
1

重要なのは、luaとJavaScriptの両方がプロトタイプベースであり、Javaはそうではないということです。リフレクションを使用して同様のことを実行できますが、JavaScriptのレベルでは実行できません。反射

于 2013-01-06T23:33:34.287 に答える
0

必要に応じて、その場で匿名クラスを作成できます。

クラスがあるとしましょう:

class Dog {
    String name;
    Dog(String name) { this.name = name; }
    void bark() { System.out.println(name + " says 'woof!'"); }

    public static void main(String...args) { 
        Dog snoopy = new Dog("snoopy");
        snoopy.bark();
    }

}

結果は次のとおりです

c:\files\j>javac Dog.java

c:\files\j>java Dog
snoopy says 'woof!'

今、彼はウーフとは言いません-彼はラフと言います!だから私たちはその場でそのように作成します

class Dog {
    String name;
    Dog(String name) { this.name = name; }
    void bark() { System.out.println(name + " says 'woof!'"); }

    public static void main(String...args) { 
        Dog snoopy = new Dog("snoopy");
        snoopy.bark();
        Dog buddy = new Dog("buddy") {
            @Override void bark() { System.out.println(name + " says 'ruff!'"); }
        };
        buddy.bark();
    }

}

その結果

c:\files\j>javac Dog.java

c:\files\j>java Dog
snoopy says 'woof!'
buddy says 'ruff!'

すべての犬を恒久的に変更したい場合、それはより困難になりますが、戦略パターンを介して行うことができます。

次のようなものがあるとしましょう

abstract class BarkingStrategy {
    public abstract void doBark(Dog dog);
}

class TypicalBarkingStrategy extends BarkingStrategy {
    public void doBark(Dog dog) { System.out.println(dog.getName() + " says 'woof!'"); }
}

class AggressiveBarkingStrategy extends BarkingStrategy {
    public void doBark(Dog dog) { System.out.println(dog.getName() + " says 'Rrrruff!'"); }
}

class Dog {
    // notice this is static - that means it belongs to the class itself, not 
    // any particular instance of it - similar to prototype
    static BarkingStrategy bark = new TypicalBarkingStrategy();
    String name;
    Dog(String name) { this.name = name; }
    String getName() { return name; }
    void bark() { bark.doBark(this); }
}

次に、次のことができます

public static void main(String...args) {
    Dog snoopy = new Dog("snoopy");
    snoopy.bark();
    Dog.bark = new AggressiveBarkingStrategy();
    snoopy.bark();
}

これにより、

c:\files\j>javac Dog.java

c:\files\j>java Dog
snoopy says 'woof!'
snoopy says 'Rrrruff!'
于 2013-01-06T23:34:02.493 に答える