如何使用类成员实现接口?

时间:2014-07-18 17:30:17

标签: c# interface

我有这个狗课:

public class Dog : IBarkable
{
      public void Bark()
      {
            Console.WriteLine("Woof!");
      }
}

我有这个人类:

public class Human : IBarkable
{
      private Dog _myDog = new Dog();

      public void Bark()
      {
            _myDog.Bark();
      }
}

有没有办法我不必明确地实现每个功能? 像这样的事情:

public class Human : IBarkable (_myDog)
{
      private Dog _myDog = new Dog();
}

谢谢!

3 个答案:

答案 0 :(得分:1)

虽然没有在visual studio中实现委派成员的功能,但resharper提供了一个。

你正在寻找res Generating Delegating Members的重新收割者。

答案 1 :(得分:1)

从逻辑的角度来看,人类无法吠叫。因此,从这个界面中派生出一个人是没有意义的。相反,你应该提供至少一个返回你的狗对象的getter方法。

答案 2 :(得分:0)

如果你试图揭露宠物"对于人类而言,一种更灵活,技术上更正确的方法是抽象巴克方法,使人类揭露宠物的某些方面。就API设计而言,拥有一种方法" Bark"并不是很直观。在一个人的对象上。还要考虑:如果人类是猫,鹦鹉,猴子和大象的宠物怎么办?在这种情况下,您的代码变得难以维护(我怀疑这就是为什么您希望"自动实现"接口方法)。

我建议稍微重构一下你的代码:

public interface ISpeakingAnimal {

    void Speak();

} // end interface IAnimal

public interface IHasPets {

    List<ISpeakingAnimal> Pets {get; set;}

    bool HasPets();

} // end interface IHasPets

public class Dog : ISpeakingAnimal {

    public void Speak() {
        Console.WriteLine("Woof");
    }
} // end class Dog

public class Cat : ISpeakingAnimal {

    public void Speak() {
        Console.WriteLine("Meow");
    }
} // end class Cat

public class Human : IHasPets {

    public Human() {
        Name = "The Doctor";
        Pets = new List<ISpeakingAnimal>();
    } // end constructor

    public string Name {get; set;}

    public List<ISpeakingAnimal> Pets {get; set;}

    public bool HasPets() {
      return Pets.Any();
    } // end method HasPets

} // end class Human

//Somewhere in your executing code
Human person1 = new Human();
ISpeakingAnimal dog = new Dog();
ISpeakingAnimal cat = new Cat();
person1.Pets.Add(dog);
person1.Pets.Add(cat);

for(int i = 0; i<person1.Pets.Count; i++) {
    person1.Pets[i].Speak();
} // end for loop

这包含几个SOLID软件开发实践,如果您对此感兴趣,可以在此处详细了解:http://www.blackwasp.co.uk/SOLID.aspx

此设计允许您随时添加新类型的宠物,而无需更改人类或其他动物。你可以在不改变人类实际性质的情况下为人类添加与其交互的方法(因为我们通常不会吠叫;)。