Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在哪里创建类_C#_Inheritance - Fatal编程技术网

C# 在哪里创建类

C# 在哪里创建类,c#,inheritance,C#,Inheritance,我试图用“facility”作为类,用一些子类作为“Activity”来建模一个生产系统。该工具有一个名称作为唯一的参数(目前),我想创建一个类实例,从文本框中读取该名称作为输入。因为“活动”是从它的“父类”继承属性的,所以我将创建类“活动”的实例,而不是它的父类 问题是我不知道在哪里创建类以及如何传递它,这样当我添加第一个子类“Workstation”时,我就可以编辑我之前创建的相同“activity”的属性 不幸的是,我现在没有任何代码要添加,但是如果你想看到什么特别的东西,请告诉我,我会尝

我试图用“facility”作为类,用一些子类作为“Activity”来建模一个生产系统。该工具有一个名称作为唯一的参数(目前),我想创建一个类实例,从文本框中读取该名称作为输入。因为“活动”是从它的“父类”继承属性的,所以我将创建类“活动”的实例,而不是它的父类

问题是我不知道在哪里创建类以及如何传递它,这样当我添加第一个子类“Workstation”时,我就可以编辑我之前创建的相同“activity”的属性

不幸的是,我现在没有任何代码要添加,但是如果你想看到什么特别的东西,请告诉我,我会尝试将它添加到帖子中


顺便说一句,它是一个带有GUI的WinForm应用程序。我正在尝试这样做。

这里有几点需要注意。首先,您需要使用封装类之间的关系。(对于那些不了解OP类型层次结构的人来说,它在工厂环境中确实非常有意义。正在进行的活动很多,可以分为工作站和更高级别的设施。)

因此,您可能应该有一个基本的
活动
类(通过公开一系列子活动来支持复合模式),然后您的“级别”(如
设施
工作站
)将从
活动
继承。这些类中的每一个都具有唯一的属性

应在各自的文件中创建以下类,例如
Activity.cs
Factory.cs
Workstation.cs

class Activity
{
    // An attribute that every Activity may need: a displayable name.
    // This might be useful if you have a TreeView, e.g., showing all the activities.
    public string Name { get; private set; }

    // Every Activity could have child activities - this is the Composite pattern.
    // You can loop through these to navigate through the hierarchy of your data.
    // (This is often done using recursion; see example below with GetAllWorkstations().)
    public List<Activity> ChildActivities { get; private set; }

    public Activity()
    {
        ChildActivities = new List<Activity>();
    }

    public override string ToString() { return Name; }
}

class Factory : Activity
{
    public string City { get; private set; }
    public string Address { get; private set; }
}

class Workstation : Activity
{
    public string WorkstationNumber { get; private set; }
}
您可以这样称呼它,例如以您的主要形式:

class MainForm : Form
{
    // ... other code

    public MainForm()
    {
        // ... other code

        // Assume this is assigned to the factory that you want to get all the workstations for
        Factory myFactory;
        var workstations = myFactory.GetAllWorkstations();
        // Now you can use 'workstations' as the items source for a list, for example.
    }
}
作为一个示例用例,您可能希望显示第二个表单(属于主表单),它显示所有工作站的列表。(实际上,您可能不应该创建太多的窗口;更喜欢构建一个不重叠的布局。但只是为了展示如何传递模型实例…)

其次,您需要在视图(用户界面代码/类)和模型(活动层次结构)之间使用适当的分隔

第三,如果要将任何类型的实时数据推送到用户界面,则需要一种数据绑定机制,以便在模型更改时自动更新视图

通常,通常通过模型-视图-模型模式来处理#2和#3。有一个极好的例子


这至少可以让你开始。还可以看到一个问题的答案。(很抱歉推广我自己的答案,但我不想把整个例子打两遍。请原谅。:)

如果没有上下文,回答这样的问题是非常困难的。你必须至少知道你正在构建什么类型的应用程序?WinForms/Console/WPF等。?遗憾的是,除非你提供更多的信息,否则你的问题很可能就要结束了。不是所有的东西都应该用继承来建模。“活动”是一种特定的“工作站”吗?我不这么认为。使用正常关联(即对象之间的引用)。@user2950764那么这里的真正问题是什么?在WinForms应用程序中的何处保存对模型的引用,以便可以重复使用?如果是这样的话,在不了解GUI设置的情况下,也没有太多的空间来回答问题。您的IDE是什么?通常,您在一个新的.cs文件中创建一个类。您可以在想要使用它的地方定义对象。也就是说,在另一个类的主体、方法或主函数中。非常感谢Lars!我使用了相反的“方法”,其中设施是父级,工作站是设施的子级,活动是设施的子级,但我认为这是错误的?当我创建一个实例时,我应该创建最后一个“孙子”的实例,因为这个实例具有其父代的所有特性,对吗?不幸的是,我无法获得太多MVWM内容,但是INotifyPropertyChanged可能非常有用!不要担心马上就进行全面的MVVM设计。:)但是,是的,
INotifyPropertyChanged
将在这方面帮助您很多!我仍在试图理解你所说的“拥有父母的所有特征”是什么意思。你的意思是说你做了类似于
课堂工作站:设施
?是的,这是错误的——工作站不是一种设施,而是一个设施包含一个或多个工作站。这就是为什么会有
活动列表
。当然,这是有道理的。但是继承并不是解决这个问题的最好方法——您应该只在与子类共享行为时使用继承。我将用一些指针更新示例代码,说明如何解决您希望执行的操作。不,
facilityName
不是一种行为,而是该设施拥有的数据。从建模的角度来看,类应该只包含它唯一拥有的数据(因此它可以控制数据的更新方式,例如使用数据库)。我将添加一些关于代码片段去向的解释。您不需要在主窗体中公开Factory实例变量。您可以在任何需要的地方(通过引用)传递它,这就解决了必须担心静态变量和实例变量的问题。
class Factory : Activity
{
    // ... other code

    public IEnumerable<Workstation> GetAllWorkstations()
    {
        return GetWorkstationsRecursive(this);
    }

    private IEnumerable<Workstation> WorkstationsIn(Activity parentActivity)
    {
        foreach (var workstation in parentActivity.ChildActivities.OfType<Workstation>)
        {
            // Uses a C# feature called 'iterators' - really powerful!
            yield return workstation;
        }
        foreach (var childActivity in parentActivity.ChildActivities)
        {
            // Using recursion to go down the hierarchy
            foreach (var workstation in WorkstationsIn(childActivity))
            {
                yield return workstation;
            }
        }
    }
}
class MainForm : Form
{
    // ... other code

    public MainForm()
    {
        // ... other code

        // Assume this is assigned to the factory that you want to get all the workstations for
        Factory myFactory;
        var workstations = myFactory.GetAllWorkstations();
        // Now you can use 'workstations' as the items source for a list, for example.
    }
}
class WorkstationListForm : Form
{
    private IEnumerable<Workstation> workstations;

    public WorkstationListForm(IEnumerable<Workstation> workstations)
    {
        this.workstations = workstations;
        //TODO: You can now use 'workstations' as the ItemsSource of a list view in this form.
    }
}
public WorkstationListForm(MainForm mainForm)
{
    var topLevelFactoryActivities = mainForm.topLevelFactoryActivities;
    // Now WorkstationListForm has full access to all the data on MainForm. This may or
    // may not be helpful (it's usually best to minimize sharing and public fields).
}