2012-08-12 26 views
0

我使用的提取方法對這個代碼,因爲有這個代碼的倍數,這裏是它變成了:C# - 通過不同類型作爲一個參數

private void InsertStatement(string table, string table2, TestURLGUI4.Form1 form, SQLiteConnection sql_con, ref int dbID, ref int dbID2, Chrome chrome, int max) 
{ 
    try 
    { 
     List<int> dbIDs = new List<int>(); 
     using (SQLiteTransaction mytransaction = sql_con.BeginTransaction()) 
     { 
      using (SQLiteCommand mycommand = new SQLiteCommand(sql_con)) 
      { 
       mycommand.CommandText = "insert or ignore into " + table + " (id, url, title, visit_count, frecency, last_visit_date) values (@dbID,@url,@title,@visit,@frecency,@time)"; 

       for (var count2 = 0; count2 < chrome.URLs.Count; count2++) 
       { 
        URL u = chrome.URLs[count2]; 
        mycommand.Parameters.Add(new SQLiteParameter("@dbID", dbID)); 
        mycommand.Parameters.Add(new SQLiteParameter("@url", u.url)); 
        mycommand.Parameters.Add(new SQLiteParameter("@title", u.title)); 
        mycommand.Parameters.Add(new SQLiteParameter("@visit", u.frequency)); 
        mycommand.Parameters.Add(new SQLiteParameter("@time", ToPRTime(u.visited))); 
        mycommand.Parameters.Add(new SQLiteParameter("@frecency", ToFrecency(u.frequency))); 
        mycommand.ExecuteNonQuery(); 
        dbIDs.Add(dbID); 
        dbID++; 
        form.label1.Text = count2 + "/" + max; 
        Application.DoEvents(); 
       } 

      } 
      mytransaction.Commit(); 
     } 
     using (SQLiteTransaction mytransaction = sql_con.BeginTransaction()) 
     { 
      using (SQLiteCommand mycommand = new SQLiteCommand(sql_con)) 
      { 
       mycommand.CommandText = "insert or ignore into " + table2 + " (id, from_visit, place_id, visit_date, visit_type, session) values (@dbID2,2,@dbID,@time,1, 0)"; 

       for (var count2 = 0; count2 < chrome.URLs.Count; count2++) 
       { 
        URL u = chrome.URLs[count2]; 
        mycommand.Parameters.Add(new SQLiteParameter("@dbID2", dbID2)); 
        mycommand.Parameters.Add(new SQLiteParameter("@dbID", dbIDs[count2])); 
        mycommand.Parameters.Add(new SQLiteParameter("@time", ToPRTime(u.visited))); 
        mycommand.ExecuteNonQuery(); 
        dbID2++; 
        form.label1.Text = count2 + "/" + max; 
        Application.DoEvents(); 
       } 

      } 
      mytransaction.Commit(); 
     } 
    } 
    catch 
    { 
     throw; 
    } 
} 

唯一的問題是,而不是瀏覽器類型,參數,我已經創建了不同類別的多個實例,我需要通過每一個,例如,我有

IE ie = new IE(); 
Firefox firefox = new Firefox(); 

等。現在,我該怎麼修改我的參數,這樣,而不是瀏覽器,我可以通過Chrome,Firefox,IE等全部在同一個參數中,一次一個?

+0

你問題的最後一句話讓我感到困惑 - 你希望能夠將任何瀏覽器作爲單個參數傳遞,或者將所有瀏覽器作爲單個參數傳遞? – Daniel 2012-08-12 22:18:01

+0

出於興趣,做這些類中的任何一個從一個公共基類繼承嗎?因爲如果是這樣,前一種情況可以通過多態代碼輕鬆解決。 – Daniel 2012-08-12 22:18:54

+0

它們中的任何一個參數都是一次一個參數。抱歉。 – 2012-08-12 22:22:02

回答

1

你的所有類型的瀏覽器,這意味着你可以(也應該)重構你的代碼,使他們都來自同一個共享的瀏覽器類派生的,如果不是已經是這樣了。一旦你這樣做,你可以多態地改變你的方法:

private void InsertStatement(string table, string table2, TestURLGUI4.Form1 form, SQLiteConnection sql_con, ref int dbID, ref int dbID2, Browser browser, int max) 

如果你不願意這樣做,那麼唯一的其他的解決辦法,我能想到的是超載的方法。

This article在C#中提供有關繼承的信息。基本上,你要做的就是:

class Browser 
{ 
} 

class IE : Browser 
{ 
} 

,則仍可初始化IE這樣的:

IE ie = new IE(); 

但你也可以多態初始化它是這樣的:

Browser ie = new IE(); 

如果派生來自瀏覽器的更多類,例如Firefox,Chrome等,那麼您可以在方法內將它們全部視爲單一類型,即瀏覽器。

2

具有不同的瀏覽器從基Browser類繼承(或實現一個共同的接口),並通過在

public abstract class Browser 
{ 
    public List<URL> URL { get; private set; } 

    protected Browser 
    { 
     URL = new List<URL>(); 
    } 

    public abstract void NavigateTo(URL url); 
} 

然後實現的瀏覽器,並根據需要它們的特定功能:

public class InternetExplorer : Browser 
{ 
    private Random rand = new Random(); 
    public override void NavigateTo(URL url) 
    { 
     if (rand.NextDouble() < 0.5) 
      throw new InvalidOperationException(); 
     else 
      url.Navigate(); 
    } 
} 

public class Firefox : Browser 
{ 
    public override void NavigateTo(URL url) 
    { 
     Thread.Sleep(250); 
     url.Navigate(); 
    } 
} 

public class Chrome : Browser 
{ 
    public override void NavigateTo(URL url) 
    { 
     url.Navigate(); 
     GoFaster(); 
    } 
} 

重寫您的方法,採取Browser並宣傳該基類所需的任何共享屬性:

private void InsertStatement(string table, string table2, TestURLGUI4.Form1 form, SQLiteConnection sql_con, ref int dbID, ref int dbID2, Browser browser, int max)

2

最好的辦法是創建一個瀏覽器類可以實現的通用接口類型(類似IBrowser)。然後你的方法簽名就變成了:

private void InsertStatement(string table, string table2, TestURLGUI4.Form1 form, SQLiteConnection sql_con, ref int dbID, ref int dbID2, IBrowser browser, int max) 

而且方法中,你必須添加一些條件邏輯來找出哪些類型是:

if(browser is Firefox) 
{ 
... 
} 

當然,如果瀏覽器類型都做同樣的事情,你應該只有一個Browser類,它有一些UserAgent字段來標識它。那麼你真的不需要條件。

0

把它們都實現一個接口:

interface Browser 
{ 

} 

class Firefox : Browser 
{ 

} 
class IE : Browser 
{ 

} 

Browser ie = new IE(); 
//... 
public void someMethod(Browser b) 
//...