Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型与抽象类_C# - Fatal编程技术网

C# 泛型与抽象类

C# 泛型与抽象类,c#,C#,我已实施了以下常规: public class GenericAnimal<T> { public int legs; public void Walk() { Console.WriteLine("Animals Walk...."); } } public class Dog { public void Bark() { Console.WriteLine("Barking....");

我已实施了以下常规:

  public class GenericAnimal<T> 
  {
    public int legs;
    public void Walk()
    {
        Console.WriteLine("Animals Walk....");
    }
}

public class Dog 
{
    public void Bark()
    {
        Console.WriteLine("Barking....");
    }
}

public class Cat 
{
    public void Mew()
    {
        Console.WriteLine("Mewing....");
    }
}
然后我使用的类如下所示:

        GenericAnimal<Dog> dogObj = new GenericAnimal<Dog>();
        GenericAnimal<Cat> catObj = new GenericAnimal<Cat>(); 

在dogObj和catObj中,我都得到了Walk方法。我可以用抽象类来做这件事。那么,与抽象类相比,使用泛型还有什么好处呢?

在您的例子中,没有。泛型在希望代码可与不同类型重用的场景中是有意义的。在GenericAnimal中,您没有使用T做任何事情。

请尝试编写以下内容:

public class Animal
{
  public int legs;
  public void Walk()
  {
      Console.WriteLine("Animals Walk....");
  }
}

public class Dog : Animal
{
   public void Bark()
    {
      Console.WriteLine("Barking....");
    }
}

public class Cat : Animal
{
   public void Mew()
   {
      Console.WriteLine("Mewing....");
   }
}

试着列两张清单:第一张是只猫的清单,第二张是只狗的清单——先不使用清单,然后再尝试使用清单。我认为它将帮助您更好地理解它

将代码更改为下一个

public class GenericAnimal<T> 
{
  public T Instance{get;set;}
  public int legs;
  public void Walk()
  {
      Console.WriteLine("Animals Walk....");
  }
}

你可以用狗和猫。但是eyossi为这种情况描述了更好的代码。

泛型和继承是两个完全不同的概念,具有完全不同的功能。没有这样的比较使用泛型比抽象类有什么额外的优势?。如果您可以从所有子对象中抽象出一些公共功能,那么使用抽象类是有意义的。是关于泛型的更多信息。

你的具体例子可以通过没有泛型的正常遗传得到更好的解决-狗和猫的子类动物。但是,假设您现在想要一个动物列表。作为非通用解决方案,您可以选择一个ArrayList,您可以向其中添加cat和dog实例。但是,ArrayList的Add方法将对象作为参数。因此,您还可以将鱼添加到列表中,鱼不能行走。当你处理这个列表告诉所有的动物行走时,你首先要检查它们是否是动物


这就是泛型的帮助。您可以使用列表定义列表,然后只能将符合is Animal的对象添加到列表中。假设鱼不是动物,那么如果你尝试添加一个,你会得到一个编译器错误。此外,当你得到列表中的项目时,你会得到动物实例,而不仅仅是对象,因此你可以告诉它们立即行走。

在你的示例中,通用是不可用的。7个问题,没有被接受的答案-如果你能为你以前的帖子标记一个a问题作为答案?你的狗会吠叫吗?你的catObj喵叫吗?你不认为谷歌搜索泛型会给你一个更好的解释吗