为什么基类对象不能在泛型基类约束中提供其成员函数和成员

本文关键字:成员 基类 函数 约束 不能 对象 泛型 为什么 | 更新日期: 2023-09-27 18:07:01

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
    public class PhoneNumber 
    {
        public  PhoneNumber()
        {
        }
            public  PhoneNumber(string n, string num) 
        {
            Member = new Dictionary<string, string>();
            Member.Add(n,num);          
        }
        public void Add(string n, string num)
        {
            Member = new Dictionary<string, string>();
            Member.Add(n,num);
        }
        public Dictionary<string,string> Member { get; set; }
    }
    class FriendsPhoneNumbers : PhoneNumber 
    {
        public FriendsPhoneNumbers (){}
        public FriendsPhoneNumbers (string n, string num, bool wk) :
        base(n, num)
        {
            IsWorkNumber = wk;
        }
        public bool IsWorkNumber { get; private set; }
    }
    class PhoneList<T> where T : PhoneNumber
    {
        T[] phList;
        int end;
        public PhoneList()
        {
            phList = new T[10];
            end = 0;
        }
        public bool Add(T newEntry)
        {
            if(end == 10) return false;
            phList[end] = newEntry;
            end++;
            return true;
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            PhoneNumber pnm=new PhoneNumber("Hii","123");
            pnm.Add("Hello","456");
            Console.WriteLine("pnm count: "+pnm.Member.Count);
            foreach(KeyValuePair<string,string> k in pnm.Member)
            {
                Console.WriteLine(k.Key+": "+k.Value);  
            }
            PhoneList<PhoneNumber> p2=new PhoneList<PhoneNumber>();
            p2.Add(new PhoneNumber("Hii!","789"));
            p2.Add(new PhoneNumber ("Hello","4565"));
            foreach(KeyValuePair<string,string> k in p2.Member)
            {
                Console.WriteLine(k.Key+": "+k.Value);  
            }
        }
    }
}
  1. 错误:PhoneList'不包含'Member'的定义,也没有'Member'的扩展方法接受PhoneList类型的第一个参数

  2. 如何在类"Phonenumber"中声明属性字典"Member = new dictionary()",以便类中的"Add"方法和构造函数都使用它并给出pnm。在Main方法中count value=2。

为什么基类对象不能在泛型基类约束中提供其成员函数和成员

p2是一个PhoneList

PhoneList<PhoneNumber> p2=new PhoneList<PhoneNumber>();

PhoneList没有成员属性,所以如下:

foreach(KeyValuePair<string,string> k in p2.Member)

没有任何意义,并正确地抛出错误。我认为你想要PhoneList从Collection继承,因为它是一个带有一些Add逻辑的自定义集合,这正是Collection的作用。然后你就有了一个类,你可以从中提取项目,然后你可以请求它们的member属性。

所以它看起来像这样:

public class PhoneList<T> : Collection<T> where T : PhoneNumber
{
    protected override void InsertItem(int index, T item)
    {
        if (this.Count() < 10)
        {
            base.InsertItem(index, item);       
        }
    }
}

它不返回true,但是您从不在代码中使用返回值。然后你可以这样写:

        foreach(var k in p2.SelectMany(x => x.Member))
        {
            Console.WriteLine(k.Key+": "+k.Value);  
        }

给你所有的数字。

对于你的初始化成员,你可能想这样做:

public class PhoneNumber 
{
    public  PhoneNumber()
    {
         Member = new Dictionary<string, string>();
    }
    public  PhoneNumber(string n, string num) : this()
    {            
        Member.Add(n,num);          
    }
    public void Add(string n, string num)
    {
        Member = new Dictionary<string, string>();
        Member.Add(n,num);
    }
    public Dictionary<string,string> Member { get; private set; }
}

无论调用什么构造函数,它总是被初始化,并且可以从类外部重置。您可以通过以下方式获得计数:

pnm.Members.Count;