10

I'm developing an application which in I got multiple types of RichTextBoxs which I've customized (RichTextBox,RichAlexBox,TransparentRichTextBox).

I want to create a method to accept all those types plus some other parameters.

private void ChangeFontStyle(RichTextBox,RichAlexBox,TransparentRichTextBox rch,
                                                         FontStyle style, bool add)
{
  //Doing somthing with rch.Rtf
}

I've searched through StackOverFlow and found some answers like this which I couldn't figure out how to use them to solve my problem

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

I also tried overloading as this answer offers,

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
  }

But I encounter this error

'ChangeFontStyle(RichAlexBox, FontStyle, bool)' 
         must declare a body because it is not marked abstract, extern, or partial

Here's some other Q&A I checked:

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

Any suggestion would be appreciated.

3 Answers 3

7

Assuming that TransparentRichTextBox and RichAlexBox are both subtypes of RichTextBox, then you only need one method signature:

private void ChangeFontStyle(RichTextBox rch, FontStyle style, bool add)
{
    //Doing somthing with rch.Rtf
}

Otherwise, you will need to implement the method for every overload:

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
}
Sign up to request clarification or add additional context in comments.

Comments

5

If you are properly using inheritance, you don't need generics or overloading:

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
}

As @dotnetkid suggests, another option is to make ChangeFontStyle a method in the RichTextBox class and make it virtual so that you can override it when you need to:

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 Comments

I would suggest making ChangeFontStyle into RichTextBox and marking it Virtual.
@dotnetkid That was the best offer ever!
1

When overloading a method do like this.

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
}

Or you can just use Control class as a parameter try like this

 private void ChangeFontStyle(Control control,FontStyle style, bool add)
 {
       // your code
 }

You can pass any Control you want like TextBox, RichTextBox, ComboBox etc..

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.