【问题标题】:How to add Classes with inheritance to a Dictionary in C# [duplicate]如何在C#中将具有继承的类添加到字典中[重复]
【发布时间】:2019-06-14 09:57:14
【问题描述】:

我对向集合中添加类有点困惑。在这种情况下是字典。

我喜欢一个“相似”的线程......但这似乎是一个完全不同的租金问题。我的问题是关于将多个类放在从公共基类继承的字典中。链接的线程是关于存储不同的类型,如 int、string、double.. 等。

class ClassName
{
    public string name { get; }
    public ClassName()
    {
        name = "name";
    }
}

class Unique : ClassName
{
    public string uName { get; }
    public Unique()
    {
        uName = "UniqueName?";
    }
}

class YAunique : ClassName
{
    public string yaName { get; }
    public YAunique()
    {
        yaName = "YetAnotherName";
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, ClassName> doesThisWork = new Dictionary<string, ClassName>();
        doesThisWork.Add("test", new Unique());
        doesThisWork.Add("test2", new YAunique());

        Console.WriteLine(doesThisWork["test"].name);
        Console.WriteLine(doesThisWork["test"].uName); //dose not work
        Console.WriteLine(doesThisWork["test2"].name);
        Console.WriteLine(doesThisWork["test2"].yaName); //does not work

        Unique example = new Unique();
        Console.WriteLine(example.name);
        Console.WriteLine(example.uName);

        YAunique example2 = new YAunique();
        Console.WriteLine(example2.name);
        Console.WriteLine(example2.yaName);

        // Pauses the console window
        Pause4Input();
    }

基本上在上面的示例中,我有 3 个类,其中 2 个是从同一个类继承而来的。如果我初始化任何一个继承类,我可以访问基类的变量和子类变量(代码底部的打印)....

....但我想做的是将这些子类放在字典中。

即使它“看起来”有点正确......我只能使用字典键访问基类中的变量。

TL;DR 我正在尝试研究如何将不同的类添加到字典集合中,并让所有子类函数和变量以及基类函数和变量都可以访问。

谢谢!

【问题讨论】:

  • 能够访问所有方法是没有意义的。想象一下,如果您有一个带有对象(最基类)的字典,您可以在其中键入世界上的任何方法,这在编译时需要知道它是否正确。简而言之,您将需要存储一个基类/对象/接口并对其进行转换(或动态和猜测)。
  • 派生类可以被基类的字典所接受,因为它们保证具有所有的属性、方法等。的基类。基类成员是可访问的。当您想要派生类的成员时,您必须将元素转换回基础类型。

标签: c#


【解决方案1】:

好吧,看起来您已经掌握了“继承”的基础知识,但您似乎对基类可以访问什么以及派生类可以访问什么感到有些麻烦。所以你有一个Dictionary&lt;string, BaseClass&gt;。当您访问此字典中的值时,它将是BaseClass 的类型。当然,它也可以是派生自BaseClass 的任何类型。但是,除非您将值转换为正确的类型,否则您无法访问派生类型的属性、方法等。但您应该小心转换的方式。请考虑模式匹配(从 c#7.0 开始)

// value is BaseClass, only methods, properties of BaseClass usable  .
var value = dict["myKey"];

// Now derived classes properties etc can be accessed.
var casted = (Derived)value;

【讨论】:

  • 如果反对者可以给出解释,我将不胜感激,以便我可以尝试修复我的答案:)
【解决方案2】:

您可以尝试利用多态性。与其在每个派生类中使用不同的“名称”属性,不如在基类中定义一个公共属性(或多个公共属性)并在派生类中覆盖它们。

using System;
using System.Collections.Generic;

abstract class ClassName {

 public abstract string Name {get;}

}

class Unique : ClassName
{
    public override string Name {
    get{return "UniqueName?";}
    }
    public Unique()
    {
    }
}

class YAunique : ClassName
{
    public override string Name {
        get{return "YetAnotherName";}
    }
    public YAunique()
    {

    }
}

public class Program
{
    public static void Main()
    {
        Dictionary<string, ClassName> doesThisWork = new Dictionary<string, ClassName>();
        doesThisWork.Add("test", new Unique());
        doesThisWork.Add("test2", new YAunique());

        Console.WriteLine(doesThisWork["test"].Name);
        Console.WriteLine(doesThisWork["test2"].Name); 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多