【问题标题】:Using single method to return possible different instance types使用单一方法返回可能的不同实例类型
【发布时间】:2017-11-21 20:29:05
【问题描述】:

所以我有这两种实例类型“FirstType”和“SecondType”,它们继承自母类“ContaBancaria”。它们都从不同的文本框返回文本。基本上,他们做同样的事情,但我需要 2 个实例来处理 2 种不同的列表类型(我可能认为该列表与我的问题没有任何关系,所以我将继续不详细说明)

以下是实例:

    private FirstType AddTypeFirst()
    {
        return new FirstType(textBoxNumber.Text,
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
    }

    private SecondType AddTypeSecond()
    {
       return new SecondType(textBoxNumber.Text,
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
    }

有没有办法以相同的方法类型返回这 2 个实例?

编辑: 我的意思是用一种方法返回这两种不同类型的实例,例如:

private [type?] AddInstance()
{
   return new [type*] textBoxNumber.Text,  //* the type could be FirstType or SecondType
            textBoxBalance.Text,
            textBoxName.Text,
            textBoxAddress.Text,
            textBoxBirth.Text);
}

编辑 2:

ContaBancaria 看起来像这样:

abstract class ContaBancaria
{
    public string number { get; set; }
    public string balance { get; set; }

    public Client data { get; set; }
}

而且,既然有客户端...

class Client
{
    public string name;
    public string address;
    public string birth;
}

希望你能得到我。

【问题讨论】:

  • 我真的不知道你在问什么,也许尝试编辑你的问题?
  • 我不知道你想做什么......如果我猜......你会想使用通用类
  • 我已经编辑了这个问题,希望你现在明白了...
  • ContaBancaria 类是什么样的?
  • 方法如何决定应该返回哪种类型?您的示例中没有决策。

标签: c# instance


【解决方案1】:

我认为你可以使用泛型方法和派生类。 例如,您有两门课程,并且您希望获得其中一门课程。这些类被命名为“FirstSon”和“SecondSon”,它们都派生自“Father”类。

class Father
{
    string myName;
    public string MyName
    {
        get { return myName; }
        set { myName = value; }
    }
    public Father()
    {
        myName = "John";
    }
}

class FirstSon : Father
{
    string mySecondName;
    public string MySecondName
    {
        get { return mySecondName; }
        set { mySecondName = value; }
    }

    public FirstSon()
    {
        mySecondName = "Bill";
    }
}

class SecondSon : Father
{
    int age;
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    string mySecondName;
    public string MySecondName
    {
        get { return mySecondName; }
        set { mySecondName = value; }
    }
    public SecondSon()
    {
        mySecondName = "Drake";
        age = 21;
    }
}

你有方法GetObject()。这个方法是通用的。它接收类的类型,然后检查它接收到的类型并返回具有相同类型的新对象。

    public static T GetObject<T>() where T: Father
    {
        var firstSon = new FirstSon();
        var secondSon = new SecondSon();
        if (firstSon.GetType() == typeof(T))
            return (T)Convert.ChangeType(firstSon, typeof(T));
        return (T)Convert.ChangeType(secondSon, typeof(T));
    }

它使用方法 Convert.ChangeType(object value, Type conversonType) 并允许您将对象转换为您的类型。

但根据How do I make the return type of a method generic?,我不相信这是个好主意

【讨论】:

    【解决方案2】:

    假设您想根据要添加的列表返回正确的类型,您需要编写自己的通用 Add 函数,并使用反射来确定类型:

    public static class Ext {
        public static void AddInstancia<T>(this List<T> aList) where T : class {
            if (typeof(T) == typeof(FirstType))
                aList.Add(AddTypeFirst() as T);
            else
                aList.Add(AddTypeSecond() as T);
        }
    }
    

    我认为没有充分的理由这样做 - 毕竟,您知道列表的类型,只需为该列表调用正确的函数...

    如果你为每个子类型添加一些函数,你也可以使用dynamic来代替反射:

    public class FirstType : Parent {
        public FirstType MakeChild() {
            return new FirstType();
        }
    }
    
    public class SecondType : Parent {
        public SecondType MakeChild() {
            return new SecondType();
        }
    }
    
    public static class Static<T> where T : new() {
        public static dynamic Value = new T();
    }
    
    public static class Ext {
        public static void AddInstance<T>(this List<T> aList) where T : new() {
            aList.Add(Static<T>.Value.MakeChild());
        }
    }
    

    你可以这样称呼

    var list1 = new List<FirstType>();
    
    list1.AddInstance();
    

    【讨论】:

    • 投反对票,没有任何解释......也许投反对票应该像接近投票一样,需要评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多