将Derived类作为参数传递给方法

将Derived类作为参数传递给方法

本文介绍了当参数类型是基类时,将Derived类作为参数传递给方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一个新手,并试图理解继承和设计模式的概念。

I am a newbie and trying to understand concepts of inheritance and design patterns.

我遇到了这种模式。

我发现它很有趣,想要了解更多。所以我开发了以下程序。

I found it interesting and wanted to learn more. So I developed the following program.

static void Main(string[] args)
{
    Context context;

    // Three contexts following different strategies
    context = new Context(new ConcreteStrategyAdd());
    int resultA = context.executeStrategy(3, 4);

    context = new Context(new ConcreteStrategySubtract());
    int resultB = context.executeStrategy(3, 4);

    context = new Context(new ConcreteStrategyMultiply());
    int resultC = context.executeStrategy(3, 4);

    Console.Read();
}

abstract class Strategy
{
    public abstract int execute(int a, int b);

    public void Test()
    {
        Console.Write("tttt");
    }
}

class ConcreteStrategyAdd : Strategy
{
    public override int execute(int a, int b)
    {
        Console.WriteLine("Called ConcreteStrategyAdd's execute()");
        return a + b;  // Do an addition with a and b
    }
}

class ConcreteStrategySubtract : Strategy
{

    public override int execute(int a, int b)
    {
        Console.WriteLine("Called ConcreteStrategySubtract's execute()");
        return a - b;  // Do a subtraction with a and b
    }
}

class ConcreteStrategyMultiply : Strategy
{
    public override int execute(int a, int b)
    {
        Console.WriteLine("Called ConcreteStrategyMultiply's execute()");
        return a * b;   // Do a multiplication with a and b
    }
}

class Context
{
    private Strategy strategy;

    // Constructor
    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b)
    {
        return strategy.execute(a, b);
    }
}

该程序编译正常并且正在运行。但我的问题是,当 Context 构造函数期望基类作为参数时,如何将派生类作为参数传递?铸造是否隐含发生?为什么编译器没有错误?

The program compiles fine and is working. But my question is how is it possible to pass derived class as a parameter when the Context constructor is expecting base class as a parameter? Is the casting happening implicitly? Why does the compiler does not error?

context = new Context(new ConcreteStrategyAdd());

public Context(Strategy strategy)
{
    this.strategy = strategy;
}


推荐答案

简单地说:

因此,当您将 ConcreteStrategyAdd 的实例传递给构造函数时,您实际上是在传递策略对象输入。

So, when you pass an instance of ConcreteStrategyAdd into the constructor, you are essentially passing a Strategy object in.

不涉及任何转换。类型层次结构允许这种类型的编程。它允许程序员在代码中使用。

There is no casting involved. The type hierarchy allows for this type of programming. It allows programmers to use polymorphism in their code.

这篇关于当参数类型是基类时,将Derived类作为参数传递给方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 06:13