【问题标题】:Polymorphism (C# .NET)多态性(C# .NET)
【发布时间】:2017-12-01 17:37:04
【问题描述】:

抱歉,如果之前有人问过这个问题,但是我无法找到真正解释如何实现或解决我的问题的答案。


我面临的问题是如何在不询问第一个对象的情况下将代码拆分为单独的类。例如,多态性最常见的解释是:

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

void letsHear(final Animal a) {
    println(a.talk());
}

int main() {
    letsHear(new Cat());
    letsHear(new Dog());
}

但是,如果我知道我想创建一个新的狗和一个新的猫怎么办。如果这是用户填写的表格,他们可以选择猫或狗。目前我会写下这个问题的解决方案:

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

void letsHear(final Animal a) {
    println(a.talk());
}

int main() {
    string userInput = Console.ReadLine();
    switch(userInput){
      case "Cat": 
         letsHear(new Cat());
         break;
      case "Dog":
        letsHear(new Dog());
        break;
    }
}

必须有比使用 case 语句找出用户选择哪个 ID 来创建类更好的解决方案。如果问题没有意义,或者这可能是解决此问题的最佳方法,请告诉我。我知道我的代码无法编译或工作,但这更多是一个架构问题,而不是具体的工作代码。

【问题讨论】:

  • 因为你不知道在运行时会创建哪种动物,那么你应该使用动物工厂,例如使用“简单工厂”或“工厂方法”模式。它让您传递动物类型(“猫”或“狗”等)并为您创建相应的动物对象。然后您可以调用letsHear() 函数,将新创建的实例传递给它。请参阅:THISTHIS。祝你好运!
  • 除非您的语言允许将字符串作为代码执行(例如,Javascript 允许这样做),否则需要切换输入。理想情况下,这种用于实例化对象的输入切换应该发生在应用程序的外围(数据进入的地方,在您的情况下,这是控制台)。您正在 main() 中进行此切换,建议@aendeerei 将逻辑提取到工厂,但这并没有真正的区别,因为切换需要在某个地方进行。只有在多个地方使用 Animal 类型时,多态的好处才会真正显现出来。
  • 我同意@jrahhali。好主意,杰拉哈利! ;-) 事实上,如果您直接决定应该创建哪个动物的“客户端”部分,那么您可以将输入与要在 main 中创建的类名结合起来。

标签: class oop inheritance polymorphism abstract-class


【解决方案1】:

如果您确定您使用 c# 代码进行开发,那么这是正确的方法

class Program
{
    abstract class Animal
    {
        public abstract string talk();
    }

    class Cat : Animal
    {
        public override string talk()
        {
            return "Meow!";
        }

        public override string ToString()
        {
            return talk();
        }
    }

    class Dog : Animal
    {
        public override string talk()
        {
            return "Woof!";
        }
        public override string ToString()
        {
            return talk();
        }
    }

    public static void Main()
    {
        Animal cat = new Cat();
        Animal dog = new Dog();

        Console.WriteLine(cat.ToString());
        Console.WriteLine(dog.ToString());
        Console.ReadKey();
    }

}

【讨论】:

    【解决方案2】:

    首先我要感谢所有回答我问题的人。

    因此,在查看了 youtube 上的所有 cmets 和视频后,我发现如果您不知道运行时所需的类型,这可能是解决问题的最佳方法。因此,实现工厂类并遵循工厂设计模式似乎是解决此问题的最简洁方法。

    希望这可以帮助与我处于相似位置的其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多