【问题标题】:Dog to Human years and vice versa [closed]狗到人类年,反之亦然[关闭]
【发布时间】:2014-04-23 22:34:30
【问题描述】:

我正在尝试这个示例问题,我必须创建两个隐式转换运算符才能从 Human 创建一个 Doggy 类,反之亦然。课程需要考虑到人类一年是 7 狗年这一事实。有人告诉我,如果从 Dog 年变为人类年以确保年龄的类型仍然是 int (当然),并且可能需要一些明确的转换。我不知道如何定义 DogToHuman.Name、DogToHuman.Age、HumanToDog.Name 和 HumanToDog.Age。我对编程有点陌生,所以我不习惯这种格式。任何数字开头都可以,就像人类 25 岁一样。

class Human
{
    public string Name;
    public int Age;
    public Human(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Doggy
{
    public string Name;
    public int Age;
    public Doggy(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class ConversionQuestion
{
    static void Main(string[] args)
    {
        Console.WriteLine("As a Human, {0} would be {1}", DogToHuman.Name, DogToHuman.Age);
        Console.WriteLine("As a Dog, {0} would be {1}", HumanToDog.Name, HumanToDog.Age);
        Console.ReadLine();
    }
}

抱歉有任何困惑,我不仅仅是在寻找答案,而是在寻找解决方法。

【问题讨论】:

  • 这就是我卡住的地方。我可以在哪里放置 DogToHuman 或 HumanToDog 以便可以定义它们?会在另一个班级吗?
  • 有很多方法可以解决这个问题 - 您需要自己尝试,然后询问您的代码是否有问题。

标签: c# explicit-conversion


【解决方案1】:

将您的 ConversionQuestion 类更改为以下内容:

class ConversionQuestion
{
    static void Main(string[] args)
    {
        Doggy dog = new Doggy("Max", 3);
        Human human = new Human("Leonardo", 23);

        Console.WriteLine("As a Human, {0} would be {1}", DogToHuman(dog).Name, DogToHuman(dog).Age);
        Console.WriteLine("As a Dog, {0} would be {1}", HumanToDog(human).Name, HumanToDog(human).Age);
        Console.ReadLine();
    }

    public static Human DogToHuman(Doggy dog)
    {
        return new Human(dog.Name, (dog.Age * 7));
    }

    public static Doggy HumanToDog(Human human)
    {
        return new Doggy(human.Name, (human.Age / 7));
    }
}

【讨论】:

  • 介意解释为什么我被否决了吗?它工作得很好..?
  • +1 撤消愚蠢的反对票。
【解决方案2】:

你几乎自己在你的问题中回答了这个问题。如果您搜索“.net 隐式转换”,您将打开此页面 (http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx),该页面向您展示如何创建隐式类型转换。基于此,我将您的课程修改如下:

class Human
{
    public string Name;
    public int Age;

    public Human( string name, int age )
    {
        Name = name;
        Age = age;
    }

    public static implicit operator Doggy( Human human )
    {
        return new Doggy( human.Name, human.Age / 7 );
    }
}

class Doggy
{
    public string Name;
    public int Age;

    public Doggy( string name, int age )
    {
        Name = name;
        Age = age;
    }

    public static implicit operator Human( Doggy dog )
    {
        return new Human( dog.Name, dog.Age * 7 );
    }
}

那么你可以这样使用它:

Human human = new Human( "Fred", 42 );
Doggy dog = human;

Console.WriteLine( "As a Human, {0} would be {1}", human.Name, human.Age );
Console.WriteLine( "As a Dog, {0} would be {1}", dog.Name, dog.Age );
Console.ReadLine();

关键在于转换是隐式,您只需将一种类型分配给另一种类型,转换就会神奇地发生。

【讨论】:

  • 神奇的转换并不总是一件好事。即使在这个例子中,我也不认为它是 - 有太多隐含的代码知识来理解第二个 sn-p 中发生的事情。如果我不写这个(或读你的答案)..第二个 sn-p 一眼看去毫无意义——这很糟糕。
  • 我认为整个作业很愚蠢,但我没有提出要求。如果要求是使用隐式转换,那就是这样做 .
  • 在OP的问题中要求实际上是explicit
  • 不,他的帖子的第一句话明确地说,“我必须做两个隐式转换运算符。”他使用了explicit-conversion 标签,但问题另有说明。在帖子中他还提到,“可能需要一些明确的转换”,但在这种情况下,他说的是确保年龄保持为int,因此可以推断他当时只是在谈论数据类型转换。请不要因为我没有八十万亿分就认为我是个文盲。
  • 冷静下来。我显然是个文盲,因为我读错了问题。你可以直接说我确实错了(我很乐意接受),而不假设互联网上的随机攻击你。
【解决方案3】:

我并不完全清楚你在问什么,但听起来你只是想要一种方法来实例化你的类并将它们传递给一些可以转换它们的年龄的方法。

无需为您编写所有代码,这是您可以使用的一种方法。根据需要修改...

class ConversionQuestion
{
    static void Main(string[] args)
    {
        Human human = ... // create an instance of Human, supply name and age
        Doggy doggy = ... // create an instance of Doggy, supply name and age

        Console.WriteLine("As a Human, {0} would be {1}", doggy.Name, DogToHumanConversion(doggy.Age));
        Console.WriteLine("As a Dog, {0} would be {1}", human.Name, HumanToDogConversion(human.Age));

        Console.ReadLine();
    }    

    private int DogToHumanConversion(int dogAge)
    {
        // convert dog age to human

        // return human age
    }

    private int HumanToDogConversion(int humanAge)
    {
        // convert human age to dog

        // return dog age
    }
}

【讨论】:

  • 对此感到抱歉,就像我说我是编程领域的新手,并且会使我未来的问题/疑虑更具描述性/解释得更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2014-11-08
  • 2012-02-16
  • 2013-08-16
  • 2012-06-27
  • 2017-02-05
  • 2012-12-01
相关资源
最近更新 更多