我正在嘗試在 Blazor WASM 中實作我自己的多語言功能。沒什么特別的,但我想確保我不會忘記用特定語言實作屬性。在 TypeScript 中,這適用于鍵入或連接物件。在 C# 中,此類物件的等價物將是一個類。我嘗試在 C# 中使用介面和抽象類,但沒有得到想要的結果。
想要的結果是我的代碼編輯器在我忘記實作屬性時提示。我應該如何進行?
我可以將所有屬性直接放入Translation類中以強制執行它們的實作,但是我將擁有一個很長的屬性串列,我更愿意將它們切碎一點。
public class NavMenuProps
{
public string FirstMenuHeader { get; set; } = "Dogs";
public string SecondMenuHeader { get; set; } = "Facilities";
public string ThirdMenuHeader { get; set; } = "Profile";
}
public abstract class Translation
{
public abstract NavMenuProps NavMenu();
}
public class English : Translation
{
public override NavMenuProps NavMenu()
{
return new NavMenuProps();
}
}
public class Dutch : Translation
{
public override NavMenuProps NavMenu()
{
return new NavMenuProps
{
FirstMenuHeader = "Honden",
SecondMenuHeader = ""
};
}
}
public class French : Translation
{
public override NavMenuProps NavMenu()
{
throw new System.NotImplementedException();
}
}
在 TypeScript 中,它會像這樣作業:
type TNavMenuProps = {
firstMenuHeader: string;
secondMenuHeader: string;
thirdMenuHeader: string;
...
}
type TLoginPageProps = {
firstLabel: string;
secondLabel: string;
...
}
type TTranslation = {
navMenu: TNavMenuProps;
loginPage: TLoginPageProps;
...
}
const englishTranslations: TTranslation = {
navMenu: {
firstMenuHeader: "first";
secondMenuHeader: "second";
// Would complain I forgot "thirdMenuHeader".
},
loginPage: {
firstLabel: "1st label";
secondLabel: "2nd label";
},
...
}
uj5u.com熱心網友回復:
如果我了解您的要求,這是解決方案
將 NavMenu 屬性宣告為介面
public interface NavMenuProps
{
public string FirstMenuHeader { get; set; }
public string SecondMenuHeader { get; set; }
public string ThirdMenuHeader { get; set; }
}
將 Translation 類宣告為具有抽象屬性的抽象類
public abstract class Translation : NavMenuProps
{
public abstract string FirstMenuHeader { get; set; }
public abstract string SecondMenuHeader { get; set; }
public abstract string ThirdMenuHeader { get; set; }
}
現在您可以實作每種語言的翻譯,如果您沒有在任何語言類中實作 NavMenuProps 屬性,代碼編輯器會抱怨“不實作繼承的抽象成員”
public class English : Translation
{
public override string FirstMenuHeader { get; set; }
public override string SecondMenuHeader { get; set; }
public override string ThirdMenuHeader { get; set; }
}
public class Dutch : Translation
{
public override string FirstMenuHeader { get; set; }
public override string SecondMenuHeader { get; set; }
public override string ThirdMenuHeader { get; set; }
}
public class French : Translation
{
public override string FirstMenuHeader { get; set; }
public override string SecondMenuHeader { get; set; }
public override string ThirdMenuHeader { get; set; }
}
uj5u.com熱心網友回復:
如果我正確理解您的要求,這可能是一種方法:制作NavMenuProps abstract,并NavMenu()在內部實施Translation。現在,與其NavMenu()在所有繼承的類中實作Translation,不如在所有這些類中實作所有屬性NavMenuProps。
public abstract class NavMenuProps
{
public abstract string FirstMenuHeader { get; }
public abstract string SecondMenuHeader { get; }
public abstract string ThirdMenuHeader { get; }
}
public abstract class Translation : NavMenuProps
{
public Translation NavMenu() => this;
}
public class English : Translation
{
public override string FirstMenuHeader => "First";
public override string SecondMenuHeader => "Second";
public override string ThirdMenuHeader => "Third";
}
現在你可以打電話
var englishMenu = new English().NavMenu();
如果需要以NavMenu()任何其他方式為某些類實作,您可以virtual在需要的地方創建并覆寫它:
public abstract class Translation : NavMenuProps
{
public virtual Translation NavMenu() => this;
}
public class English : Translation
{
//...
public override Translation NavMenu()
{
//return base.NavMenu();
}
}
uj5u.com熱心網友回復:
(代表問題作者發布的答案,將其移至答案部分)。
該解決方案并不比只有一個巨大的介面好多少,但它可以滿足我的需要,即具有可管理的介面,并且 IDE 會在我忘記實作某個欄位時告訴我。
受公認答案啟發的解決方案:
public interface INavMenuProps
{
public string FirstMenuHeader { get; set; }
public string SecondMenuHeader { get; set; }
public string ThirdMenuHeader { get; set; }
}
public interface ILoginPageProps
{
public string FirstLabel { get; set; }
public string SecondLabel { get; set; }
}
public interface Translation : INavMenuProps, ILoginPageProps
{
}
public class English : Translation
{
public string FirstMenuHeader { get; set; } = "Dogs";
public string SecondMenuHeader { get; set; } = "Facilities";
public string ThirdMenuHeader { get; set; } = "Profile";
public string FirstLabel { get; set; } = "1st label";
public string SecondLabel { get; set; } = "2nd label";
}
public class Dutch : Translation
{
}
public class French : Translation
{
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/424210.html
上一篇:繼承的框架-缺少屬性
