我正在开发一个应用程序,我在其中获得了多种类型的RichTextBox
,我已经定制了(RichTextBox,RichAlexBox,TransparentRichTextBox)
。
我想创建一个方法来接受所有这些类型以及其他一些参数。
private void ChangeFontStyle(RichTextBox,RichAlexBox,TransparentRichTextBox rch,
FontStyle style, bool add)
{
//Doing somthing with rch.Rtf
}
我搜索了StackOverFlow并找到了一些答案like this我无法弄清楚如何使用它们来解决我的问题
void foo<TOne, TTwo>() //There's just one parameter here
where TOne : BaseOne //and I can't figure out how to define my other two parameters
where TTwo : BaseTwo
我还尝试重载为this answer商品,
private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add);
private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add);
private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
{
//Some codes
}
但是我遇到了这个错误
'ChangeFontStyle(RichAlexBox, FontStyle, bool)'
must declare a body because it is not marked abstract, extern, or partial
这是我检查过的其他一些Q&amp; A:
Generic method with multiple constraints
Can I create a generic method that accepts two different types in C#
C# generic method with one parameter of multiple types
任何建议都将不胜感激。
答案 0 :(得分:5)
假设TransparentRichTextBox
和RichAlexBox
都是其子类型
RichTextBox
,那么您只需要一个方法签名:
private void ChangeFontStyle(RichTextBox rch, FontStyle style, bool add)
{
//Doing somthing with rch.Rtf
}
否则,您需要为每个重载实现该方法:
private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add)
{
//Some codes
}
private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add)
{
//Some codes
}
private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
{
//Some codes
}
答案 1 :(得分:5)
如果您正确使用继承,则不需要泛型或重载:
class RichTextBox
{
// implementation
}
class RichAlexBox : RichTextBox
{
// implementation
}
class TransparentRichTextBox : RichTextBox
{
// implementation
}
// allows passing in anything that inherits from RichTextBox
private void ChangeFontStyle(RichTextBox rch, FontStyle style, bool add)
{
// implementation
}
正如@dotnetkid建议的那样,另一种选择是在RichTextBox类中使ChangeFontStyle
成为一个方法并使其成为虚拟方法,以便在需要时可以覆盖它:
class RichTextBox
{
public virtual void ChangeFontStyle(FontStyle style, bool add)
{
// implementation
}
// implementation
}
class RichAlexBox : RichTextBox
{
// uses the inherited ChangeFontStyle
// implementation
}
class TransparentRichTextBox : RichTextBox
{
public override void ChangeFontStyle(FontStyle style, bool add)
{
// TransparentRichTextBox-specific implementation
}
// implementation
}
答案 2 :(得分:1)
当重载方法时,请执行此操作。
private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add)
{
// your code
}
private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add)
{
// your code
}
private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
{
// your code
}
或者你可以使用Control
类作为参数尝试这样
private void ChangeFontStyle(Control control,FontStyle style, bool add)
{
// your code
}
您可以传递任何您想要的控制权,例如TextBox
,RichTextBox
,ComboBox
等。