2011-12-26 156 views
0

我看到了一個類「AttributeSelectedClassifier」在以下幾個方面曾經創造機制:關於創建一個類的對象

AttributeSelectedClassifier classifier = new AttributeSelectedClassifier(); 

classifier.setClassifier(base); 
classifier.setEvaluator(eval); 

上面這一個看起來自然給我。但接下來的情況如何。

classifier = new AttributeSelectedClassifier(); 
((AttributeSelectedClassifier)classifier).setClassifier(base); 
((AttributeSelectedClassifier)classifier).setEvaluator(eval); 

我覺得應該是對的,但我不太肯定的定義分類爲((AttributeSelectedClassifier)分類),如何理解這種用法​​的方法是什麼?

回答

1

看下面的代碼。 Person實現CanWalk接口。如果您將一個Person指定爲CanWalk接口(如通常慣例所示),則只能調用CanWalk接口中指定的方法,即walk()。如果您想要調用f(),那麼不是CanWalk界面中聲明的,那麼您將使用您在文章中指定的第二種機制。即轉換成它到Person類,然後調用該方法。

對於API(這裏的主要方法)的用戶來說,在處理對象時使用正確的抽象是一種很好的做法。對於例如如果客戶主要關注移動人的話,那麼它應該使用CanWalk。這樣,客戶端不會受到與移動無關的Person類的更改影響。閱讀this article瞭解更多詳情。

interface CanWalk 
{ 
    void walk(); 
} 

class Person implements CanWalk 
{ 
    void walk() 
    { 
    System.out.println("I am walking"); 
    } 

    void f() 
    { 
    ///some arbitrary method 
    } 
} 

public stativ void main(String a[]) 
{ 
    CanWalk cw=new Person(); 
    ((Person)cw).f(); 
} 
1

此:

((AttributeSelectedClassifier)classifier) 

不是 「定義」 或 「聲明」 分類 - 這是鑄造它。據推測在這種情況下,classifier被宣佈爲AttributeSelectedClassifier的一些超類。代碼雖然不是特別清楚。我已經重寫代碼的第二位(假設你不能改變的classifier聲明)到:

AttributeSelectedClassifier temp = new AttributeSelectedClassifier(); 
temp.setClassifier(base); 
temp.setEvaluator(eval); 
classifier = temp; 

你使用的AttributeSelectedClassifier所有方法的不太強烈賦值之前這樣-type classifier變量。

(我可能會使用更清晰的名字比temp,但我們沒有足夠的背景下制定出這樣的名字會是什麼。)

1

這樣做((AttributeSelectedClassifier)classifier)您是鑄造(」 迫使 「)classifier對象的行爲類似於AttributeSelectedClassifier的實例。

classifier變量可能以前被聲明爲AttributeSelectedClassifier的超類。

2

這意味着分類器變量被聲明爲AttributeSelectedClassifier的超類或超接口,並且您需要調用未在類或接口中定義但僅在AttributeSelectedClassifier上定義的方法。這個符號蒙上的變量AttributeSelectedClassifier

Object classifier = new AttributeSelectedClassifier(); 
// classifier is a AttributeSelectedClassifier, but references as Object 
// to call the following method, we need to cast it to AttributeSelectedClassifier 
((AttributeSelectedClassifier)classifier).setClassifier(base); 
((AttributeSelectedClassifier)classifier).setEvaluator(eval); 

這通常是一個設計問題的跡象。方法應該在超類或接口中,或者變量應聲明爲AttributeSelectedClassifier