可以使用基类型声明参数

时间:2018-01-22 04:52:46

标签: c# unity3d

Resharper为此代码说参数可以用基类型声明,我该如何解决这个问题,以及有什么好处?我对C#很新,很抱歉,如果我错过了一些基本的概念..

IEnumerator RemoveGameObject(float waitTime, GameObject go) {
    yield return new WaitForSeconds(waitTime);
    Destroy(go);
}

我看过this thread,但我不理解..也许我需要阅读基础类型..

1 个答案:

答案 0 :(得分:2)

这是基于最佳实践,设计指南和编程原则的建议。

在创建和决定方法的参数类型时,应使用满足方法执行其作业所需的最低要求的参数类型。您将使用满足这些要求的接口,或者满足这些要求的继承链中的最低类。

在您的示例中,方法" 销毁(p) "似乎只使用不仅存在于 GameObject 中的属性或方法,而且还使用其基类型(它继承自的类)。 "的 销毁(p)的 "不需要"额外的东西" GameObject 带来了它。所以通过使用 GameObject 的基础,它满足" Destroy(p) "需要履行其职责,您允许从该基础派生的任何类也能够作为参数传递给" 销毁(p) & #34;

一个例子: 考虑一下这段代码(可能不是最好的,但应该这样做)

public class Animal
{
    public void Eat(Food food) { }
    public void Breath() { }
}

public class Dog : Animal
{
    public void Bark() { }
}

public class Human : Animal
{
    public void Speak() { }
}

现在我创建一个类似的方法:

 public void PerformLifeDuties(Human joe, Food food)
{
    joe.Eat(food);
    joe.Breath();
}

我只限制了我的代码。现在我无法传递 动物 Dog 或任何派生类型的 动物 ,我只能传递 Human 。尽管该方法的唯一要求是 Animal ,但我可以调用 eat 和的 呼吸 即可。更好的方法是使参数 Animal

 public void PerformLifeDuties(Animal animal, Food food)
{
    animal.Eat(food);
    animal.Breath();
}

现在我可以将此方法用于 人类 Dog 和派生类型。如果我的方法需要让 动物 发言,那么我至少需要指定 Human

来自微软的页面:

  

✓使用提供的最少派生参数类型   会员要求的功能。

您可以在此处查看Microsoft的一些C#设计指南:Parameter Design