Andrew
Andrew

Reputation: 2539

Alternative to assignment operator overloading

Let me start off by stating that I know the assignment operator in C# cannot be overloaded/overridden. However, if I have a class like so:

public class Time
{

    private int Hour, Minute;
    public int minutes;

    public Time(int m)
    {
        this.minutes = m;
        this.Hour = m / 60;
        this.Minute = m % 60;
    }

    public Time(int hh, int mm)
    {
        this.minutes = 60 * hh + mm;
        this.Hour = hh;
        this.Minute = mm;
    } 

    public static explicit operator Time(int i1)
    {
        return new Time(i1);
    } 

}

Two things:

1) Is the explicit conversion overload at the bottom necessary?

2) I want to do

Time newTime = 510;

and have Hour and Minute reflect the new minutes. Without making another object, is the only way to make a function like so:

    public void changeminutes(int m)
    {
        this.minutes = m;
        this.Hour = m / 60;
        this.Minute = m % 60;
    }

and do this:

Time newTime = new Time();
newTime.changeminutes(510);

edit:

I probably should have mentioned that I'm still in learning C#. A lot of your suggestions are flying over my head. Sorry.

next edit : This isn't necessarily about time. I just used it to illustrate my example.

Upvotes: 2

Views: 1428

Answers (4)

pickypg
pickypg

Reputation: 22332

First, you want to use implicit casting to achieve Time x = 123;, but as others are pointing out it's probably a poor design choice because it's not immediately clear what the number represents (and most people would assume a Unix timestamp).

Second, why not use the Minutes property to set minutes, and simply convert the value into the proper value, while changing Hours?

time.Minutes = 510;

// in class def:

public int Minutes
{
    get { return minutes; }
    set
    {
        hours = value / 60;
        minutes = value % 60;
    }
}

Upvotes: 0

Marino Šimić
Marino Šimić

Reputation: 7342

For you case an implicit conversion would work but...

Conversions are not to be used when you loose data, or even semantics like in this case. You know that the number will become a Time, but you don't know which unit of time will the number be converted into.

If somebody is going to read the code it will not have any clue what the number represents without looking at the internal definition of the Time class. Think if that was in an outside project. Debugging hell? :)

Upvotes: 0

Dan J
Dan J

Reputation: 16708

It looks like you're trying to make a reference type behave like a value type, which is... um, tricky. If you really don't want to use the constructor for this (and explaining why that is might help us answer), you can use a static "factory" method:

public static Time FromMinutes(int m)
{
  return new Time(m);
}

And use it like this:

var t = Time.FromMinutes(510);

This is similar to what the TimeSpan class lets you do.

Upvotes: 1

SLaks
SLaks

Reputation: 887365

You can create an implicit cast from int to Time.

However, I recommend against it.
Unless they're between equivalent types (eg, int and long), implicit casts will end up creating lots of confusion.
In addition, it isn't obvious that that should mean minutes and not seconds.

You can create a much nicer syntax using extension methods:

Time t = 510.Minutes();

Upvotes: 4

Related Questions