为什么基类对象不能在泛型基类约束中提供其成员函数和成员
本文关键字:成员 基类 函数 约束 不能 对象 泛型 为什么 | 更新日期: 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);
}
}
}
}
错误:PhoneList'不包含'Member'的定义,也没有'Member'的扩展方法接受PhoneList类型的第一个参数
如何在类"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;