2012-06-01 76 views
0

我將在此前面說這絕不是一個主要問題,更多的是我在編程語言設計方面沒有真正聽過的東西,而我是想知道是否有人有任何有趣的解決方案。面嚮對象語言中的抑制方法返回

問題的癥結在於此。有時候在面向對象的語言中,我希望能夠通過其中一種方法修改對象,但返回對象本身而不是該方法返回的內容。

給一個java例如:

class MyClass{ 
    public MyClass(List<Integer> list){ 
     //do constructor stuff 
    } 

    public MyClass(Integer i){ 
     //what I would like to be able to do 
     this((new LinkedList<Integer>).add(i)); 
    } 
} 

我不能創建在第二個構造的臨時列表,因爲這()必須是第一道防線。顯然有很多方法可以通過更改實現來實現,例如創建一個返回對象的add()方法,使其成爲構造列表對象的函數的責任,等等。

但是,考慮很多時候你不能/不想修改或創建一個子類(對於LinkedList),你可能不想篡改調用代碼,能夠修改並返回一個對象,其格式爲+ + x可能非常有用。像 this(#(new LinkedList).add(i)來表示你想要的對象,而不是方法返回。有誰知道一種語言允許這是一些簡潔的語法方式?如果沒有,這是否會有用或者我在這裏丟失了什麼?

+0

你的問題是有點困難在你真正想要達到什麼樣的條件來理解。 – Casey

+0

@AndrasK任何答案都可以接受? – Justin

+0

我想實現的關鍵是通過他們的方法修改匿名對象的乾淨方式。有可能通過讓所有類的方法返回自己來實現,但這並不是「乾淨」的, – AndrasK

回答

1

這不工作?

public class MyClass{ 
    public MyClass(List<Integer> list){ 
     //do constructor stuff 
    } 

    public static MyClass create(Integer i) { 
     List<Integer> list = new new LinkedList<Integer>(); 
     list.add(i); 
     MyClass myClass = new MyClass(list); 
     return myClass; 
    } 
} 

這是一種常見的設計模式,稱爲Factory Pattern

0

我認爲最簡單的方法來解決這個問題,是從構造函數調用一個初始化方法。

class MyClass { public MyClass(List list){ init(list); }

public MyClass(Integer i){ 
    LinkedList<Integer> list = new LinkedList<Integer>(); 
    list.add(i); 
    init(list); 
} 

protected init(List<Integer> list) 
{ 
    // do init stuff here 
} 

}