最佳实践是针对接口而不是具体类进行编程。我想保留实现接口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"));
答案 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)
{
}
}