Ghasem
Ghasem

Reputation: 15573

Method parameter to accept multiple types

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.

Upvotes: 10

Views: 41729

Answers (3)

JLRishe
JLRishe

Reputation: 101662

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
}

Upvotes: 5

dan
dan

Reputation: 532

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..

Upvotes: 1

poke
poke

Reputation: 387557

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
}

Upvotes: 7

Related Questions