【问题标题】:List inside Class Inheriting from Interfaces - Add to list from within class?从接口继承的类中的列表 - 从类中添加到列表?
【发布时间】:2015-04-09 00:49:39
【问题描述】:

请原谅这个糟糕的标题,无法用几句话完全解释我的问题。我正在尝试根据一些粗略的指导方针制作一个简单的日历应用程序,这些指导方针让我走到了这一步。

我有一个名为 Apts 的类,它继承自接口 IApts,而该接口本身又继承自另一个接口 IApt。我的代码如下:

IApt

public interface IApt
{
    DateTime Start { get; }
    int Length { get; }
    string Description{ get; }
    bool Occurs(DateTime date);
}

IApts

public interface IApts : IList<IApt>
{
    bool Load();
    bool Save();
    IEnumerable<IApt> GetAptsOnDate(DateTime date);
}

Apts (当然要降到最低)

class Apts: IApts
{
    public List<IApt> myAppointments = new List<IApt>();

    public Apts()
    {
        // Constructor must be empty - guideliness
    }

    public bool Load()
    {
        //Code to load appointment data from file to variables below
        string startTime = x;
        string lengthTime = y;
        string description = z;

        IApt loadedAppointment = new IApt(aptStartDate, aptLength, aptDescription);
                myAppointments.Add(loadedAppointment);
    }

#IList Methods
#IEnumerable Methods
}

希望我的代码 sn-ps 能让您了解我在这里想要实现的目标。我将从我的 mainForm 中创建 Apts 类的一个实例,以保存我的所有约会,如下所示:

IApts _Appointments = new Apts();

我现在想做两件事。我想从我的 IApt 类型的 mainForm 添加项目(这甚至可能吗?:S)。我还希望在创建实例后能够从我的 mainForm 调用我的 Load() 方法,以便使用内容将来自简单文本文件存储的约会填充列表 myAppointments。

如果我正在尝试做的事情是可能的,有人可以建议我吗?其他一切都准备就绪,我只需要能够访问在创建 Apts 实例时创建的列表并向其中添加 IApt 类型的对象。

或者创建另一个类是否有意义,可能命名为 Apt,因为创建 Apts 类型的新对象将创建另一个列表..?我希望有人在跟踪我,呵呵..我的头在旋转!

【问题讨论】:

  • 你自己试过了吗?仅凭情报就应该告诉您有可能做到..
  • 如果您指的是创建另一个类 Apt,那么是的,我知道这是可能的,但我想知道是否有必要,因为我正在使用的指南似乎表明只有 Apts 类是需要的。我在这里是个新手,所以我希望有更多经验的人可以为我指明正确的方向,所以我知道我到目前为止所做的事情至少是正确的:)
  • 智能是一个糟糕的拼写检查,我提到了visual studio intellisense。抱歉,如果这听起来很粗鲁,Mybad 哈哈。

标签: c# inheritance ienumerable ilist


【解决方案1】:

你应该创建一个Add 方法并实现它:

public interface IApts
{
    bool Load();
    bool Save();
    void Add(IApt appointment);
    IEnumerable<IApt> GetAptsOnDate(DateTime date);
}

class Apts: IApts
{
    private List<IApt> myAppointments = new List<IApt>();

    public void Add(IApt appointment)
    {
        this.myAppointments.Add(appointment);
    }

    // rest of class omitted for brevity
}

顺便说一句,您可能希望将myAppointments 设为私有。你公开了太多了。

【讨论】:

  • 感谢您的回答。当我从 IList 继承时,我已经创建了一个 add 方法,尽管我没有在上面说清楚 IList 方法都已经实现了。
  • @Jamie4840 那么为什么不直接调用Add 方法来添加项目呢?你真的应该从你的程序的其余部分隐藏你的类的实现。
【解决方案2】:
public interface IApt
{
    DateTime Start { set;get; }
    int Length { set;get; }
    string Description{ set;get; }
    bool Occurs(DateTime date);
}

将此属性添加到接口 IApts

List<IApt> myAppointments {set;get;} 

实现这个接口例如:

public class Apt : IApt
{
    public DateTime Start { set;get; }
    public int Length { set;get; }
    public string Description{ set;get; }
    public bool Occurs(DateTime date){

    }
}

然后

 IApts _Appointments = new Apts();

    IApt apt = new Apt();
    apt.Start=...
    apt.Length=...
    _Appointments.myAppointments.Add(apt);
_Appointments.Load();

不想对您的命名约定做出判断,只要它们在整个代码中保持不变,但公共成员通常是 UpperCamelCase 和 private 以 _lowerCamelCase 或 lowerCamelCase 为前缀。

【讨论】:

  • 添加 List myAppointments {set;get;} 到界面?还是他不想换界面?
  • 谢谢,我的指导方针是错误的sigh。创建 Apt 类是解决方案!将检查这些命名约定哎呀
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多