C#儿童班拒绝打球-请提供一点多态帮助:-)

C#儿童班拒绝打球-请提供一点多态帮助:-),c#,interface,polymorphism,abstract-class,C#,Interface,Polymorphism,Abstract Class,好的。。C#不是我的强项,我已经有一段时间没有意识到这一点了,我忘记了一些事情:我也在努力做到这一点——服从我:-)我很确定我想在C#中做的事情是可能的,我也很确定我的抽象和接口都是地狱(我甚至不知道如何安装接口,但我知道我需要一个) 好的,下面是场景 //abstract parent class abstract class ActionType { /*** * this is a parent class not meant to ever be instaciated

好的。。C#不是我的强项,我已经有一段时间没有意识到这一点了,我忘记了一些事情:我也在努力做到这一点——服从我:-)我很确定我想在C#中做的事情是可能的,我也很确定我的抽象和接口都是地狱(我甚至不知道如何安装接口,但我知道我需要一个)

好的,下面是场景

//abstract parent class
abstract class ActionType
{
    /***
     * this is a parent class not meant to ever be instaciated
     */
    public abstract void action();      
}

class ActionTypeSync : ActionType
{
    public override void action()
    {
        Debug.WriteLine("doing sync");
    }
}

class ActionTypeRead : ActionType
{
    public override void action()
    {
         Debug.WriteLine("doing read");
    }
}
以下方法不起作用

ActionType action = getActionType(1);
ActionType secondaction = getActionType(2);
[编辑]

事实上,我说得太简短了,这一点不适用于错误

错误参数1:无法从“ActionType”转换为“ActionTypeSync”

processThings(action);
//debug out put "doing sync"    
processThings(secondaction);
//debug out put "doing sync"   

public ActionType getActionType(int i)
{
     if (i==1) return new ActionTypeSync();
     if (i==2) return new ActionTypeRead();
}

public void processThings(ActionTypeSync action)
{
     action.action();
}

public void processThings(ActionTypeRead action)
{
     action.action();  
}
[/EDIT]

我需要如何最好地重构这个……请理解,为了简洁起见,这是一个例子(尽我所能),我在这里总结-因此一些原则比一些“为什么等”讲座要好:-)谢谢:-)我不反对为了适应多态性原则而进行重组,但我需要这个基本的多形接口/类结构,因为它是

忽略你的语法错误,这正是你让它做的

它正在对您实例化的特定类型调用本地
action()
,它没有执行任何其他操作,因为您没有告诉它(即,在任何阶段您都不会调用
base.action()

编辑: 根据您的编辑
ActionTypeSync
ActionTypeRead
都可以转换为
ActionType
,但是
ActionType
不能转换回这些派生类型中的任何一种。您可以将其中一个派生对象作为
ActionType
传递,并将调用重写的
action()
方法,但不能隐式或显式地将其强制转换为派生类型。要解决此问题,只需更改方法签名:

public void processThings(ActionType action)
{
     action.action();
}

由于此更改,您现在只需要一个方法来处理这两个派生类型,因为您已将其向下转换为其基本类型-这样您就可以摆脱
processThings(ActionTypeRead action)
方法。

这将在编译时失败,因为i=1是赋值,您只能使用等式i==1进行检查,更正它!你说的“它不起作用”到底是什么意思?除了编译错误,它还应该工作。从概念上讲,这是正确的。@Alberto,你从来没有见过打字错误吗?评论:-/-编辑过的typo@Frederik@JeffE我编辑过以更充分地解释。。否决票?好的,我已经显示了错误。。我原以为是“我输入的位”,但实际上是“之后的位”。实际代码相当长,不值得全部共享。。因此,breifif by
语法错误
你只是指微小的打字错误(而且,如果我坦率地说没有提及),那么好吧,但是如果你是指其他的东西,你能详细说明一下吗?谢谢,但这不是我需要做的,抽象父类大约有12个子类,情况就是这样。。简单地说,我需要编译器在
processThings
上“信任”我,当我告诉它方法将在那里时-我相信接口会这样做?@conners接口告诉编译器,“实现我的任何东西都承诺有一个与此完全相同的方法”,但类的其余部分的定义可能大不相同。抽象基类表示“这里是方法定义,您的孩子需要提供详细信息”。它们很相似,但有细微的不同。通常我会在抽象基类上实现一个接口来实现我所需要的。到目前为止,你的方法没有任何问题,只是对如何实现这一目标有一个小小的误解。是的,你是对的,我一直都有一个问题,在程序的深层次,与排队有关,不喜欢我是如何做到的,所以我让孩子们回到个人身上处理他们的功能,但这似乎是一条死胡同,而不是这里的这条。。那个错误(前几天我犯的那个错误,导致了上面这条死胡同的u形转弯——看起来——并不像后来看起来的那样有问题)