Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现此接口的典型方法_C# - Fatal编程技术网

C# 实现此接口的典型方法

C# 实现此接口的典型方法,c#,C#,我的数据库中的动物表中有不同类型的动物行 我有一个带Speak方法的IAnimal接口 我有不同的动物类来实现IAnimal接口狗、猫等 是否迭代类型的记录检查,然后根据类型实例化正确的对象,然后调用它们的Speak方法 这是使用接口的一种典型方式吗?如果您知道对象实现了IAnimal,那么就不需要关心对象的类型 var animal = (IAnimal)animals[i]; animal.Speak(); 检查,其中包括示例。不,这不是典型的方式,基本上你会有一个方法来获取接口的实例,然

我的数据库中的动物表中有不同类型的动物行

我有一个带Speak方法的IAnimal接口

我有不同的动物类来实现IAnimal接口狗、猫等

是否迭代类型的记录检查,然后根据类型实例化正确的对象,然后调用它们的Speak方法


这是使用接口的一种典型方式吗?

如果您知道对象实现了IAnimal,那么就不需要关心对象的类型

var animal = (IAnimal)animals[i];
animal.Speak();

检查,其中包括示例。

不,这不是典型的方式,基本上你会有一个方法来获取接口的实例,然后你可以在那里调用Speak方法。您不必关心传入的对象是什么具体类型,其美妙之处在于您可以及时添加更多类型,而无需更改实现

大概是这样的:

public void Speak(IAnimal animal)
{
    animal.Speak();
}

如果试图在关系数据库中表示派生类型,则有以下选项:

每个派生类型都有自己的表,例如狗、猫等的不同表 将所有对象存储在动物表中,并在列中指定类型 您有一个动物表,动物之间有公共列,特定列有单独的表。 您似乎选择了选项2

通常,您将使用IAnimal接口作为方法的返回类型或另一个方法的参数,而不是在实例化之后立即调用speak方法

例如,以下代码可能对接口使用有意义:

public IList<IAnimal> GetAnimals()
{
    var animals = new List<IAnimal>();
    foreach(var animal in db.Animals)
    {
        animals.add( // instantiate new animal here)
    }
    return animals;
}

这将允许调用者让所有动物说话,而不管它们的基本类型。当然,如果接口只有一个speak方法,那么它可能不会非常有用。

在本例中,您所谈论的关系类型是一种isa关系。狗是一种动物。面向对象设计中的关系是使用基类而不是接口实现的

所以你有一个动物的基类。然后你就有了一类从动物身上继承下来的狗

当您从数据库中检索数据时,您可以按其类型创建每个动物,但要添加到动物列表中

然后,调用函数可以遍历动物对象列表并调用Speak,而无需知道每个对象是什么

public void MakeAnimalsSpeak()
{
    // gets your animals from the database
    List<Animal> animals = GetAnimals();

    foreach(Animal animal in animals)
    {
        animal.Speak();
    }
}

private List<Animals> GetAnimals()
{
    List<Animal> animalsToReturn = new List<Animal>();

    // get data from db

    // loop through data

        // switch on "type" field, create correct object.

        // add too List.

    return animalsToReturn;
}

对不起,我不明白。您能否提供一个代码或描述接口的含义@PicrofoEGY我相当确定OP意味着接口,因为在语言功能中,它是许多面向对象和半多态编程语言的一部分,比如C.=在本例中,Animal应该是一个基本对象,而不是接口。接口实现了具有关系的。基本对象实现的是关系。狗是一种动物。但是门有门铃。使用基类。@J.Steen非常感谢您提供的信息。祝你有美好的一天:@scott.korin从它的使用方式来看,我不同意。每种动物都会说话。接口或多或少地告诉您可以做什么,是吗=假设在开始创建对象并将其插入阵列时,该对象被创建为正确的对象。但是,Animal实际上是一个基类,而不是一个接口。我怀疑这是因为你没有回答这个问题本身——如果这就是接口的使用方式。@J.Steen编辑答案。。。如果最初的反对者也发表评论那就太好了。从理论上说,你是对的。更重要的是,你如何描述你的环境。我们可以说,任何动物都有一种说话的方式,即IAnimal界面。接口是一个契约,它绑定一个类来表示某种行为。如果我在类型上使用switch语句,并且我有了一个新的类型,那么我必须将该案例添加到switch语句并重新编译。如何避免这种情况?可以使用系统反射和激活器。见此: