我有这个狗课:
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();
}
谢谢!
答案 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
此设计允许您随时添加新类型的宠物,而无需更改人类或其他动物。你可以在不改变人类实际性质的情况下为人类添加与其交互的方法(因为我们通常不会吠叫;)。