2017-01-09 48 views
-2

该程序是关于C#中的多态性。但是调用方法在Visual Studio中不起作用。该程序会出现错误,如“名称”呼叫“在当前上下文中不存在”。C#中的简单多态性

class dog 
{ 
} 
class cat 
{ 
} 
class process 
{ 
    static void Call(dog d) 
    { 
     Console.WriteLine("dog is called"); 
    } 
    static void Call(cat c) 
    { 
     Console.WriteLine("cat is called"); 
    } 
} 
class polymorphism 
{ 
    public static void Main() 
    { 
     dog dog = new dog(); 
     cat cat = new cat(); 
     Call(dog); 
    } 

} 
+7

移动'Call'方法到你的'polymorphism'类或使用'过程。调用'而不是。不过,它与多态性无关。 – haim770

+4

你的多态性和我的定义是非常不同的,它似乎... – DavidG

+0

@DavidG有趣的是答案是upvoted。 –

回答

2
class process 
{ 
    public static void Call(dog d) //2 
    { 
     Console.WriteLine("dog is called"); 
    } 
    public static void Call(cat c) //3 
    { 
     Console.WriteLine("cat is called"); 
    } 
} 
class polymorphism 
{ 
    public static void Main() 
    { 
     dog dog = new dog(); 
     cat cat = new cat(); 
     process.Call(dog); //1 
    } 
} 

我做了什么改变?

  1. 过程有Call,不polymorphism。因此,请拨打process致电Call

  2. 和3.如果您尚未定义访问级别,则无法访问类之外的方法。所以,我添加了public,因为我们需要访问process类以外的Call

希望它有帮助。

3

您必须告诉来自哪个类的静态方法 - 即process.Call(dog);。这应该使其工作

+1

不要忘记公开静态方法。另一种方法是使'多态性'继承'进程' – DavidG

0

有一些问题,你的程序:

  1. 您没有使用函数,但与方法。这意味着当你不在process之内时,你不能在没有指定类的情况下调用Call
  2. Call方法没有明确的可见性,这意味着它们默认为private,因此不可在process之外调用。
  3. 你的程序中没有什么多态(甚至没有catdog)。你在做什么是验证超载的作品。重载不是面向对象的概念。这是句法糖。最重要的是,你的方法是static。静态方法没有多态性。

发行1和2您正在解决这样的:

class process 
{ 
    public static void Call(dog d) 
    { 
     Console.WriteLine("dog is called"); 
    } 
    public static void Call(cat c) 
    { 
     Console.WriteLine("cat is called"); 
    } 
} 
class polymorphism 
{ 
    public static void Main() 
    { 
     dog dog = new dog(); 
     cat cat = new cat(); 
     process.Call(dog); 
    } 
} 
-2

//polymorphism 
 
    class dog 
 
    { 
 
     
 
    } 
 
    class cat 
 
    { 
 
    } 
 
    class process 
 
    { 
 
     static void Call(dog d) 
 
     { 
 
      Console.WriteLine("dog is called"); 
 
     } 
 
     static void Call(cat c) 
 
     { 
 
      Console.WriteLine("cat is called"); 
 
     } 
 
    
 
     public static void Main() 
 
     { 
 
      dog dog = new dog(); 
 
      cat cat = new cat(); 
 
      Call(dog); 
 
      Console.ReadLine(); 
 

 
     } 
 
    }

+0

Akshay,你在做什么? – ColinM

+0

我只是想学习编程....从书“C#编程”... @ColinM –

0
using System; 

namespace ConsoleApp 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var dog = new Dog(); 
      var cat = new Cat(); 
      var whale = new Whale(); 

      var c = new Caller(); 

      c.CallFeature(dog); 
      c.CallFeature(cat); 
      c.CallFeature(whale); 

      Console.ReadKey(); 
     } 
    } 

    class Cat : Animal 
    { 
     public override string Feature() 
     { 
      return "sharp claws"; 
     } 
    } 

    class Dog : Animal 
    { 
     public override string Feature() 
     { 
      return "big teeth"; 
     } 
    } 

    class Whale : Animal 
    { 

    } 

    class Animal 
    { 
     public virtual string Feature() 
     { 
      return "unknown features"; 
     } 
    } 

    class Caller 
    { 
     public void CallFeature(Animal a) 
     { 
      Console.WriteLine("a {0} has {1}", a.GetType().Name, a.Feature()); 
     } 
    } 
}