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

C# 如何使用类成员实现接口?,c#,interface,C#,Interface,我有一门狗课: public class Dog : IBarkable { public void Bark() { Console.WriteLine("Woof!"); } } 我有一个人类阶级: public class Human : IBarkable { private Dog _myDog = new Dog(); public void Bark() {

我有一门狗课:

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();
}
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

谢谢

尽管visual studio中没有实现委派成员的功能,但resharper提供了一个


你要找的是一个再锋利的人。

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

如果你想暴露人类的“宠物”,一种更灵活、技术上更正确的方法是提取树皮法,让人类暴露“宠物”的某些方面。就API设计而言,在人类对象上使用方法“吠叫”不是很直观。还要考虑:如果人类把猫、鹦鹉、猴子和大象当作宠物呢?在这种情况下,您的代码很难维护(我怀疑这就是为什么您希望“自动实现”接口方法的原因)

我建议您将代码稍微重构成以下内容:

public class Human : IBarkable (_myDog)
{
      private Dog _myDog = new Dog();
}
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
公共接口是动物语言{
无效说话();
}//结束接口IAnimal
公共接口IHasPets{
列出宠物{get;set;}
bool HasPets();
}//结束接口IHasPets
公家犬:我说的是动物{
公开演讲{
控制台。书写线(“Woof”);
}
}//末级狗
公共类猫:ISpeakingAnimal{
公开演讲{
控制台。书写线(“喵喵”);
}
}//终端类Cat
公共类人:IHasPets{
公共人权(){
Name=“医生”;
Pets=新列表();
}//结束构造函数
公共字符串名称{get;set;}
公共列表宠物{get;set;}
公共图书馆{
归还宠物。任何();
}//结束方法HasPets
}//最终类人
//在执行代码的某个地方
人类1=新人类();
ispeakinganimaldog=新狗();
ISpeakingAnimal cat=新的cat();
person1.Pets.Add(狗);
person1.Pets.Add(猫);

对于(int i=0;i没有自动接口实现委托,这是原因之一(如果不是主要原因)为什么“组合重于继承”有时很痛苦。你必须手动完成。这是一个强烈的信号,表明
Human
不应该实现
IBarkable
,而应该有一个返回
IBarkable
对象的方法/属性(在本例中是狗)@Servy:在人类身上有一种与人类和狗互动的方法不是更好吗?你不想随便把它分发给任何要求它的人就可以了。(德墨忒尔定律)@jgauffin它不会以任何方式公开任何它目前没有公开的东西。如果
IBarkable
实现没有将它们全部指向狗,那么人类实际上正在做一些事情,改变行为,可能会限制狗公开的行为的某些方面。此外,这将是不重要的我想把它公开为一个
IBarkable
对象,而不是一个
Dog
。通常情况下,组合对象在这里实现接口的原因是,它不想将所有内容无条件地转发给单个对象。我不是说继承更好,而是说没有属性的组合更好(如果你想有更好的封装/控制),他为什么要违反德米特定律,按照你的建议去做呢?