【问题标题】:C# Using data from another class in a classC# 在一个类中使用来自另一个类的数据
【发布时间】:2016-09-29 16:12:51
【问题描述】:

第一次发布问题,因为到目前为止,我一直在这里找到我正在寻找的答案,所以请耐心等待。 :)

关于这个问题,我正在测试我在控制台应用程序中制作的界面,以便在游戏中使用。 我得到了一个角色的接口,也为它做了一个类。在我的主代码中,我可以成功地从我的类(Character1Class)中调用我的“sCharacterName”。

在我的 (SwordClass) 中,我没有装备武器的空间,我希望它显示如下:“(sCharacterName) 已装备 (sWeaponName)。” 但是每当我尝试时,它都会显示为空格而不是名称。 这是我的代码的一部分:

namespace ConsoleInterfaceTest
{
    class Program
    {
        public interface ICharacters
        {
            // The name of the character
            string sCharacterName { get; set; }
        }

        public interface IWeapon
        {
            // The name of the weapon
            string sWeaponName { get; set; }

            void Equip();
        }

        public class Character1Class : ICharacters
        {
            // The name of the character
            public string sCharacterName { get; set; }

            public Character1Class(string v)
            {
                sCharacterName = ("ZeeAars");
            }
        }

        public class SwordClass : IWeapon, Characters.ICharacters
        {
            // The name of the weapon
            public string sWeaponName { get; set; }

            public string sCharacterName { get; set; }

            public SwordClass(string sName)
            {
                sWeaponName = sName;
            }

            public void Equip()
            {
                Console.WriteLine(sCharacterName + " equiped " + sWeaponName + ".");
            }
        }

        public static void Main (string[] args)
        {
            Characters.Character1Class character1 = new Characters.Character1Class("");
            character1.CharacterDamage(50);


            Weapons.SwordClass sword = new Weapons.SwordClass("TestSword");
            sword.Equip ();

            Console.ReadKey();
        }
    }
}

在此先感谢,这几天真的让我头疼了几天:D

【问题讨论】:

  • 我无法真正理解您要做什么,但我感觉您对接口的用途和作用有完全错误的想法 -没有任何东西可以设置你的剑类的sCharacterName 属性——为什么Sword 会是ICharacter?查找有关接口的介绍性教程可能是个好主意(尽管我不确定它们是否能解决您的问题)。
  • 按照您的设置方式,武器拥有角色。这会在以后给你带来很多问题。
  • 知道我希望character.Equip(sword),而不是sword.Equip()(与角色没有关联)可能很有用。
  • CharacterDamage() 未定义,您的示例无法编译。同意别人的观点,为什么剑会实现ICharacter
  • @DGibbs 我怀疑他认为让两个类实现相同的接口会使它们共享属性(因此建议去了解接口的工作原理)。

标签: c# class interface


【解决方案1】:

我同意其他人的观点,即您需要重新考虑如何使用接口以及如何构建对象层次结构,而只是简单地回答所提出的问题;

Weapons.SwordClass sword = new Weapons.SwordClass("TestSword");
// Add the following line to your code
sword.sCharacterName = character1.sCharacterName;
sword.Equip();

【讨论】:

  • 谢谢,它有效。我已经阅读了 cmets 并意识到我的愚蠢。一周前学习了自己的接口,所以我想我需要为此做更多的研究。如果你有任何你曾经理解过的帖子、文章或教程,请告诉我,因为我真的可以使用帮助:D
【解决方案2】:

我认为你正在寻找这样的事情:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    public static void Main(string[] args)
    {
        Character1Class character = new Character1Class("Zoltan the Powerful");
        SwordClass sword = new SwordClass("Holy Avenger");
        character.Equip(sword);
        character.Attack();


        Console.ReadKey();
    }

    public interface ICharacters
    {
        // The name of the character
        string sCharacterName { get; set; }
        void Equip(IWeapon weapon);
    }

    public interface IWeapon
    {
        // The name of the weapon
        string sWeaponName { get; set; }

        int Attack();
    }

    public class Character1Class : ICharacters
    {
        // The name of the character
        public string sCharacterName { get; set; }

        public Character1Class(string charName)
        {
            sCharacterName = charName;
        }

        public void Equip(IWeapon weapon)
        {
            MyWeapon = weapon;
            Console.WriteLine(sCharacterName + " equiped " + weapon.sWeaponName + ".");
        }

        public IWeapon MyWeapon { get; set; }

        public void Attack()
        {
            if (MyWeapon == null)
            {
                Console.WriteLine(sCharacterName + " punches for 1 pt of damage.");
            }
            else
            {
                Console.WriteLine(string.Format("{0} swings for {1} pt of damage.", sCharacterName, MyWeapon.Attack()));
            }
        }
    }

    public class SwordClass : IWeapon
    {
        // The name of the weapon
        public string sWeaponName { get; set; }

        public SwordClass(string sName)
        {
            sWeaponName = sName;
        }


        public int Attack()
        {
            return 50;
        }

    }
}

}

【讨论】:

    【解决方案3】:

    一定要多考虑一下结构。问问题。一些可能的问题包括。

    武器有角色还是角色拥有武器?
    角色拥有武器。

    所以现在我们知道武器应该是角色的属性。

    一个角色可以拥有多少武器? 一个角色可以拥有许多武器,但只能装备他们手上允许的数量。

    所以现在我们知道我们的武器属性将需要存储不止一种武器,但可以装备较少数量的武器。

    public interface ICharacters
    {
        string sCharacterName { get; set; }
        List<IWeapon> Weapons { get; }
        void Equip(IWeapon toEquip);
    }
    
    public interface IWeapon
    {
        string sWeaponName { get; }
    }
    
    public class Character1Class : ICharacters
    {
        public string sCharacterName { get; set; }
        public List<IWeapon> Weapons { get; }
    
        public Character1Class(string v)
        {
            Weapons = new List<IWeapon>();
            sCharacterName = v;
        }
    
        public void Equip(IWeapon toEquip)
        {
            if (Weapons.Contains(toEquip))
                Console.WriteLine(sCharacterName + " equiped " + toEquip + ".");
            else Console.WriteLine(sCharacterName + " doesn't have " + toEquip + " to equip.");
        }
    }
    
    public class SwordClass : IWeapon
    {
        public string sWeaponName { get; }
    
        public SwordClass(string sName)
        {
            sWeaponName = sName;
        }
    }
    
    class Program
    {
        public static void Main(string[] args)
        {
            Character1Class character1 = new Character1Class("Frodo");
            SwordClass sword = new SwordClass("TestSword");
            character1.Weapons.Add(sword);
            character1.Equip(sword);
            Console.ReadKey();
        }
    }
    

    【讨论】:

    • 我怎样才能更好地改进我的代码结构,我很想知道这一点,以便将来能够更好地制定我的代码。
    • 有很多关于设计模式、面向对象设计的书籍。如果您更喜欢自己动手做的方法,请先提出本文中的问题。我会用更多的问题和答案来扩展帖子。
    • 好吧,我在学校学习 c#,但我和一些高年级的朋友交谈,他们告诉我,如果不是一个不知道还能教什么的老师,他们就不会学这个他们。所以要升到顶峰,我需要自己教哈哈哈。我得到了''head first C#'',你对书籍或在线教程有什么其他建议吗?
    • 我的建议是弄清楚你想写什么样的软件,然后搜索 StackOverflow 以获得推荐阅读。一些搜索主题包括 SOLID 和 ACID 原则、设计模式、单元测试、测试驱动开发和控制反转。但这只是一个开始。
    • 我会调查的,谢谢你的建议,祝你有美好的一天:D
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多