一、方法
同一個類中的兩個方法之間出現了代碼的重復,那么可以將重復的代碼提取成一個方法來調用。
二、類
兩個類之間出現了代碼重復,可以將這部分代碼提取出來,組成一個類,把這個類當作基類,原來兩個類對它進行繼承。
組合:例如:
class A
{
public void f()
{
}
}
class B
{
private A a = new A();
public void f1()
{
a.f();
}
}
這樣我們在類B中也可以使用類A中的f方法。
案例:
class A
{
public void f()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
}
public void fa()
{
}
}
class B
{
public void f()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
}
public void fb()
{
}
}
我們要在里面解決代碼重復的問題:
首先說說組合:
首先,我們可能會想到在類B中創建一個類A,也就是說:
class A
{
public void f()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
}
public void fa()
{
}
}
class B
{
A a = new A();
public void f()
{
a.f();
}
public void fb()
{
}
}
這個方法確實可行,也就是采用了組合的方法,但是,我們會發現,它使得類B中不僅能夠調用類A中的f()方法;也能調用類A中的fa()方法,這是我們所不允許的。所以,我們可以采用以下方式:
class C
{
public void f()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
}
}
class A
{
private C c = new C();
public void f()
{
c.f();
}
public void fa()
{
}
}
class B
{
private C c = new C();
public void f()
{
c.f();
}
public void fb()
{
}
}
也就是說直接把重復代碼弄成一個新的類,然后引用這個類。這是采用了組合的方法。
下面來講一下繼承的方法來解決重復代碼:
class C
{
public void f()
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
}
}
class A:C
{
private C c = new C();
public void f()
{
c.f();
}
public void fa()
{
}
}
class B:C
{
private C c = new C();
public void f()
{
c.f();
}
public void fb()
{
}
}
三、泛型
解決僅僅因為數據類型不同而造成的代碼重復。比如:定義一個list鏈表,可以是double類型的,也可以是int類型的,操作都一樣,那么我們可以定義一個object類型
四、類庫
動態鏈接庫。兩個項目之間出現了很多相同的類,可以把這些類封裝在一起,做成一個動態鏈接庫(類庫)。例如:TIM,QQ之間的很多功能相同,他們之間使用到了類庫 。
五、母版頁和內容頁
這個是用在C#的頁面設計階段,將母版頁和內容頁的內容相組合的方式來解決代碼重復的問題。例如我們在一個博客網站的看別人的博客,只有博文的這一塊版面是變化的,我們把它作為內容頁,其余部分
可以當作母版頁不變,這些內容頁都連接到這一個母版頁上,就可以做到不必要求當前博主的每一篇博文都重復編寫母版頁的那部分內容,直接上傳博文就可以了。