使用Collection <interface>是可能的,但它是否正确?

时间:2016-03-13 10:33:25

标签: c#

最佳实践是针对接口而不是具体类进行编程。我想保留实现接口IPet的类的容器。这是对的吗? List<IPet> petList = new List<IPet>();或者创建一个抽象类更好吗?

public interface IPet
    {
        string Name { get; set; }
        void Introduce();
    }
    public class Parrot : IPet
    {
        public string Name { get; set; }

        public Parrot(string name)
        {
            Name = name;
        }

    public void Introduce()
    {
        Console.WriteLine($"My name is {Name}. I am a parrot");
    }
}

public class Cat : IPet
{
    public string Name { get; set; }
    public Cat(string name)
    {
        Name = name;
    }

    public void Introduce()
    {
        Console.WriteLine($"My name is {Name}. I am a cat");
    }
}

  PetShop petShop = new PetShop();
  petShop.Add(new Cat("Garfield"));
  petShop.Add(new Parrot("Kesha"));

2 个答案:

答案 0 :(得分:1)

在泛型中使用界面是不错的选择!

使用抽象类强制您将任何类型放在单个继承链中,这可能导致应用程序演变出现问题。

此外,如果你有一个重复的行为,你可以创建实现所需接口的抽象类,这样你就可以获得两种方式的优势。

答案 1 :(得分:0)

您可以轻松创建抽象类并将所有重复逻辑放入其中。您的课程看起来一样,只有Introduce()方法不同,但您可以使用this.GetType().Name.ToLower()代替“cat”和“parrot”。

所以,您可以拥有以下内容:

public abstract class Pet : IPet
{
    public string Name { get; set; }

    protected Pet(string name)
    {
        Name = name;
    }

    public void Introduce()
    {
        Console.WriteLine($"My name is {Name}. I am a {this.GetType().Name.ToLower()}");
    }
}

public class Cat : Pet
{    
    public Cat(string name)
        : base(name)
    {       
    }   
}