[英]What is the best way to add i18n to an existing custom CMS system (build with C#)?
[英]What's the best way to add custom functionality to existing code in C#?
比方說,我有很多Web應用程序使用在C#中編譯成dll的相同類庫,我想更新特定應用程序的類的特定方法。 我不想更改現有代碼,因為它會影響每個人,我不想從類繼承來創建新代碼。 我只想更改單個應用程序的類的現有方法。
實現此目的的一種方法是將編譯的類作為“基礎”類,並具有包含繼承基類的所有重寫類的單獨文件。 然后應用程序將使用繼承的類。 然后,要更改單個應用程序的類,您只需更新繼承的類。 我用這種方法看到的唯一問題是每個應用程序都需要2個文件,一個基類和一個繼承(可能沒有編譯)。
任何人都可以推薦更好的方法嗎?
也許擴展方法可行?
您無法更改已編譯方法的實現; 多態性是一種選擇; 另一種是封裝,可能是通過接口上的裝飾器模式,使用工廠來創建實例 - 即
interface IFoo { void Bar();}
class Foo : IFoo {public void Bar() { /* imp 1 */ } }
class FooWrapper : IFoo {
IFoo parent;
public FooWrapper(IFoo parent) {this. parent = parent;}
public void Bar() { /* imp 2, perhaps using "parent" }
}
(我不會打擾多態的例子)
多態性和裝飾實現了類似的目的,但具有不同的優點/缺點 - 例如,裝飾器可以在靈活的鏈中組裝以用於不同的場景。
使用任何其他方法(例如擴展方法),您最終會調用另一種方法; 如果那適合,那很好。
我認為擴展方法是最好的選擇。 有關更多信息,請轉到此處
在不使用繼承類的情況下,您無法覆蓋現有方法,這似乎很奇怪。 這在javascript等語言中非常簡單。 以上建議給了我深思,但是我的初步想法確實改善了。 擴展方法不允許您修改現有方法。 使用封裝,我仍然需要使用新類。
假設我有10個應用程序都使用類user和方法login()。 我不想改變調用此方法的位置(即更改類名或方法參數)。 我只想更改該應用程序的方法本身,以便在返回之前進行額外的檢查。
是否可以在類庫Virtual中創建該方法? 這將允許您在您想要的地方覆蓋它,但另外保持“原樣”。
多態性似乎是最好的解決方案。 這樣就可以編譯基類並保持單獨使用,並且可以為各個應用程序更改繼承類,而無需更改原始使用方式(除非必要)。
BaseClasses.cs
public class BaseUser {
public BaseUser() {}
public bool login() {
return false;
}
}
Classes.cs
public class User : BaseUser {}
應用
User u = new User();
u.login();
擴展方法。 這應該添加到靜態類。 您應該訪問: http : //weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
DateTime類的擴展方法示例,使其返回周數:
public static int WeekNumber(this DateTime dtPassed)
{
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = 0;
try
{
weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed,
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday);
}
catch (Exception ex)
{
//TODO: Add error handling code
}
return weekNum;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.