简体   繁体   English

C#-从其他类中的另一个类访问方法?

[英]C# - Accessing methods from another class within other classes?

I have recently started my journey to learn C# so I'm in no way an expert. 我最近开始了学习C#的旅程,因此我绝对不是专家。 Anyways, I tried to create an object-oriented calculator but I've run in to a problem where it seems like I can't access methods from other classes within certain classes. 无论如何,我试图创建一个面向对象的计算器,但是遇到了一个问题,即我似乎无法访问某些类中其他类的方法。 I get no error codes but when I put a breakpoint down and debug the application the value of the variables are 0. 我没有错误代码,但是当我放下断点并调试应用程序时,变量的值为0。

If I remove the method from DisplayUserData and paste the code in my main program file, it runs fine. 如果我从DisplayUserData中删除该方法并将代码粘贴到我的主程序文件中,它将运行良好。 It seems like the DisplayUserData class can't pass the variables or retrieve variables from other classes, why is this? 似乎DisplayUserData类无法传递变量或无法从其他类检索变量,这是为什么?

Oh and, excuse the horrible method, class and variable names. 哦,不好意思的方法,类和变量名。

Here is my main program file: 这是我的主程序文件:

namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            GetUserInput userInput = new GetUserInput();
            Calculator calculator = new Calculator();
            DisplayUserData displayUserCalculation = new DisplayUserData();


            userInput.MethodOfCalculation();
            userInput.UserNumberInput();
            displayUserCalculation.DisplayCalculatedUserData();

        }
    }
}

Followed by my GetUserInput class: 接下来是我的GetUserInput类:

namespace Calculator
{
    public class GetUserInput
    {
        public char Choice;
        public decimal ValueOne;
        public decimal ValueTwo;

        public void MethodOfCalculation()
        {
            Console.WriteLine("Welcome to Calculator v.1!");
            Console.WriteLine("Please choose a method of calculation below.");
            Console.WriteLine("1: Addition");
            Console.WriteLine("2: Subtraction");
            Console.Write("Your choice: ");
            Choice = Console.ReadKey().KeyChar;
        }

        public void UserNumberInput()
        {
            Console.Clear();
            Console.WriteLine("Please enter two numbers for calculation!");
            Console.Write("Number One: ");
            ValueOne = Convert.ToDecimal(Console.ReadLine());
            Console.Write("Number Two: ");
            ValueTwo = Convert.ToDecimal(Console.ReadLine());
        }

    }
}

And the Calculator class: 和Calculator类:

namespace Calculator
{
    public class Calculator
    {
        public decimal CalculateUserInput(char userChoice, decimal valueOne, decimal valueTwo)
        {
            decimal calculatedValue = 0;

            switch (userChoice)
            {
                case '1':
                    calculatedValue = valueOne + valueTwo;
                    break;
                case '2':
                    calculatedValue = valueOne - valueTwo;
                    break;
            }

            return calculatedValue;
        }
    }
}

And lastly the DisplayUserData class: 最后是DisplayUserData类:

namespace Calculator
{
    class DisplayUserData
    {
        GetUserInput _userInput = new GetUserInput();
        Calculator _calculator = new Calculator();

        public void DisplayCalculatedUserData()
        {
            decimal calculatedValue = _calculator.CalculateUserInput(_userInput.Choice, _userInput.ValueOne, _userInput.ValueTwo);

            switch (_userInput.Choice)
            {
                case '1':
                    Console.WriteLine("Addition: " + _userInput.ValueOne + " + " + _userInput.ValueTwo + " = " + calculatedValue);
                    break;
                case '2':
                    Console.WriteLine("Subtraction: " + _userInput.ValueOne + " - " + _userInput.ValueTwo + " = " + calculatedValue);
                    break;
            }
        }
    }
}

You are creating new versions (instances) of the UserInput and Calculator classes in your DisplayUserData class. 您正在DisplayUserData类中创建UserInputCalculator类的新版本(实例)。 Because you were using new instances, those instances didn't have access to the data contained in the instances used in your main method. 因为您使用的是新实例,所以这些实例无权访问main方法中使用的实例中包含的数据。 Instead of creating the new instances in your class, pass the existing instances in through a constructor for the class to use. 无需在类中创建新实例,而是将现有实例通过构造函数传递给该类使用。

namespace Calculator
{
    class DisplayUserData
    {
        private readonly GetUserInput _userInput;
        private readonly Calculator _calculator;

        DisplayUserData(GetUserInput userInput, Calculator calculator)
        {
            _userInput = userInput;
            _calculator = calculator;
        }

        public void DisplayCalculatedUserData()
        {
            decimal calculatedValue = _calculator.CalculateUserInput(_userInput.Choice, _userInput.ValueOne, _userInput.ValueTwo);

            switch (_userInput.Choice)
            {
                case '1':
                    Console.WriteLine("Addition: " + _userInput.ValueOne + " + " + _userInput.ValueTwo + " = " + calculatedValue);
                    break;
                case '2':
                    Console.WriteLine("Subtraction: " + _userInput.ValueOne + " - " + _userInput.ValueTwo + " = " + calculatedValue);
                    break;
            }
        }
    }
}

Then call it as 然后称它为

displayUserCalculation.DisplayCalculatedUserData(userInput, calculator);

Your DisplayUserData class has references to different Calculator and GetUserInput classes than the ones that your Program refers to. 您的DisplayUserData类所引用的与本程序所引用的计算器和GetUserInput类不同。 You should pass the same instances to DisplayUserData like this. 您应该像这样将相同的实例传递给DisplayUserData。

class DisplayUserData
{
    readonly GetUserInput _userInput;
    readonly Calculator _calculator;

    public DisplayUserData(Calculator calculator, GetUserInput userInput)
    {
        _calculator = calculator;
        _userInput = userInput;
    }

    public void DisplayCalculatedUserData()
    {
        ...
    }
}

Program would then be: 程序将是:

class Program
{
    static void Main(string[] args)
    {
        GetUserInput userInput = new GetUserInput();
        Calculator calculator = new Calculator();
        DisplayUserData displayUserCalculation = new DisplayUserData(calculator, userInput);

        userInput.MethodOfCalculation();
        userInput.UserNumberInput();
        displayUserCalculation.DisplayCalculatedUserData();

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM