我有一个具有x个属性的基类,然后我得到了具有更多属性的类。如何处理方法中的公共字段,然后将对象发送到另一个可以处理其附加属性的方法?
示例:
public Interface IAnimal {
int NoOfFeet;
}
class Animal: IAnimal {
int NoOfFeet {get;set;}
}
class Elephant: Animal {
bool hasTrunk {get;set;}
}
class Dog:Animal {
string canBark {get;set;}
}
Method1(IAnimal a) {
//process NoOfFeet ...
//process fields for derived type
DoSomething(IAnimal a)
}
DoSomething(Elephant e) {
//process trunk
}
DoSomething(Dog d) {
//process canbark
}
答案 0 :(得分:5)
听起来你基本上想要在执行时重载解析。 (我假设您不能引入虚拟方法来做正确的事情,并在每个类中实现它。如果实现了解您的内容是合理的,那将是最干净的方法。 #39;与他们一起做,但情况并非总是这样。)实现这一目标的最简单方法是使用dynamic
,如C#4中所述:
public void Method(IAnimal animal)
{
// We don't want to call Handle with a null reference,
// or we'd get an exception to due overload ambiguity
if (animal == null)
{
throw new ArgumentNullException("animal");
}
// Do things with just the IAnimal properties
Handle((dynamic) animal);
}
private void Handle(Dog dog)
{
...
}
private void Handle(Elephant elephant)
{
...
}
private void Handle(object fallback)
{
// This method will be called if none of the other overloads
// is applicable, e.g. if a "new" implementation is provided
}
答案 1 :(得分:1)
不进入高级策略的最佳方法是使用is
关键字。
例如:
Method1(IAnimal a) {
// process NoOfFeet
if (a is Elephant)
DoSomething((Elephant)a);
else if (a is Dog)
DoSomething((Dog)a);
}
如果Elephant
和Dog
等可能包含您需要专门解决的其他子类,那么您需要使用typeof
代替is
:
Method1(IAnimal a) {
// process NoOfFeet
if (a.GetType() == typeof(Elephant))
DoSomething((Elephant)a);
else if (a.GetType() == typeof(Dog))
DoSomething((Dog)a);
}
答案 2 :(得分:1)
将该方法作为该类的一部分并覆盖它。
<p id="spinner">Stop, I'm getting dizzy!</p>
答案 3 :(得分:0)
听起来你可以使用Template method pattern
abstract class Animal
{
public void DoSomething()
{
// do stuff all animals have here
DoSomethingVirtual(); // call virtual method to do stuff for specific animal
}
private abstract void DoSomethingVirtual();
}
class Elephant : Animal
{
private override void DoSomethingVirtual()
{
// do elephant stuff here
}
}
现在当您在任何动物对象上调用DoSomething()
时,基类将处理常用功能,然后将执行传递给派生类以便