Передача объектов между разными файлами - PullRequest
0 голосов
/ 06 апреля 2010

Обычно, если я хочу передать объект в экземпляр чего-либо, я бы сделал это так ...

Листинг 1
Файл 1:

public class SomeClass  
{  
    // Some Properties
    public SomeClass()  
    {  
        public int ID  
        {  
            get { return mID; }  
            set { mID = value; }  
        }  
        public string Name  
        {  
            set { mName = value; }  
            get { return mName; }  
        }  
    }  
}  

public class SomeOtherClass  
{  
    // Method 1  
    private void Method1(int one, int two)  
    {  
        SomeClass USER;  // Create an instance
        Squid RsP = new Squid();  
        RsP.sqdReadUserConf(USER); // Able to pass 'USER' to class method in different file.
    }  
}  

Аналогичный подход к листингу 1, но я не смог заставить его работать. Что я тут не так делаю?

Листинг 2 (это не работает, почему?)
Файл 1:

private void SomeClass1 
{  
    [snip]  
    TCOpt_fM.AutoUpdate = optAutoUpdate.Checked;  
    TCOpt_fM.WhiteList = optWhiteList.Checked;  
    TCOpt_fM.BlackList = optBlackList.Checked;  
    [snip]  

    private TCOpt TCOpt_fM;  
    TCOpt_fM.SaveOptions(TCOpt_fM);  
}  

Файл 2:

public class TCOpt:
{  

    public TCOpt OPTIONS;

    [snip]  

    private bool mAutoUpdate = true;  
    private bool mWhiteList = true;  
    private bool mBlackList = true;  

    [snip]  

    public bool AutoUpdate
    {
        get { return mAutoUpdate; }
        set { mAutoUpdate = value; }
    }

    public bool WhiteList
    {
        get { return mWhiteList; }
        set { mWhiteList = value; }
    }

    public bool BlackList
    {
        get { return mBlackList; }
        set { mBlackList = value; }
    }

    [snip]  

    public bool SaveOptions(TCOpt OPTIONS)  
    {  
        [snip]  
        Some things being written out to a file here  
        [snip]  

        Squid soSwGP = new Squid();
        soSgP.sqdWriteGlobalConf(OPTIONS);
    }  
}  

Файл 3:

public class SomeClass2
{
    public bool sqdWriteGlobalConf(TCOpt OPTIONS)  
    {
        Console.WriteLine(OPTIONS.WhiteSites);  // Nothing prints here
        Console.WriteLine(OPTIONS.BlackSites);  // Or here
    }  
}  

В этом примере я не смог использовать подход в листинге 1. Возможно, потому что листинг 1 передает объект между классами. Принимая во внимание, что ниже, вещи определены в одном классе. Мне пришлось использовать несколько дополнительных шагов (проб и ошибок), чтобы заставить вещи работать. Я не уверен, что я сделал здесь или как это называется. Это хорошая практика программирования? Или есть более простой способ сделать это (как в листинге 1).

Листинг 3 (это работает)
Файл 1:

private void SomeClass1  
{  
    private TCOpt TCOpt_fM;  
    [snip]  
    TCOpt_fM.AutoUpdate = optAutoUpdate.Checked;  
    TCOpt_fM.WhiteList = optWhiteList.Checked;  
    TCOpt_fM.BlackList = optBlackList.Checked;  
    [snip]  

    TCOpt_fM.SaveOptions(TCOpt_fM);  
}  

Файл 2:

public class TCOpt:
{  

    public TCOpt OPTIONS;

    [snip]  

    private bool mAutoUpdate = true;  
    private bool mWhiteList = true;  
    private bool mBlackList = true;  

    public bool AutoUpdate
    {
        get { return mAutoUpdate; }
        set { mAutoUpdate = value; }
    }

    public bool WhiteList
    {
        get { return mWhiteList; }
        set { mWhiteList = value; }
    }

    public bool BlackList
    {
        get { return mBlackList; }
        set { mBlackList = value; }
    }

    [snip]  

    public bool SaveOptions(TCOpt OPTIONS)  
    {  
        [snip]  
        Some things being written out to a file here  
        [snip]  

        Squid soSwGP = new Squid();
        soSwGP.OPTIONS = OPTIONS;
    }  
}  

Файл 3:

[snip]  
private TCOptions TCOpt_TCS;
public TCOpt OPTIONS
{
    get { return TCOpt_TCS; }
    set
    {
        TCOpt_TCS = value;
        sqdWriteGlobalConf();
    }
[snip]  

public class SomeClass2
{  
    public bool sqdWriteGlobalConf()  
    {  
        Console.WriteLine(OPTIONS.WhiteSites);  
        Console.WriteLine(OPTIONS.BlackSites);  
    }  
}  

Заранее спасибо,
XO

1 Ответ

1 голос
/ 06 апреля 2010

Сначала кажется, что у вас совершенно неверная картина о том, как работает ООП (или, надеюсь, просто неправильные слова).

Вы не передаете объект между файлами. Вы передаете их между классами. Обычно вы помещаете один класс в один файл, и в этом случае ваше описание будет правильным. Но, тем не менее, вы можете поместить несколько классов в один файл, а также порождать один класс для нескольких файлов (используя ключевое слово частичное ).

Так что, чтобы быть полностью правильным, вы также не проходите занятия. Вы передаете экземпляры классов. И проблема в вашем примере заключается в том, что вы объявляете объект определенного класса, но не создаете его экземпляр:

private void Method1(int one, int two)  
{  
    SomeClass USER;  // This doesn't create an instance!
    USER = new SomeClass(); //This creates an instance.

    //SomeClass USER = new SomeClass(); //Can also be written as one-liner.

    Squid RsP = new Squid();  
    RsP.sqdReadUserConf(USER); // Able to pass 'USER' to class method in different file.
}  

Обновление

Прочитав ваш комментарий, я посмотрел на ваш второй и третий пример. Возможно, это снова опечатка в листинге 2, файл 1, но вы изменили ее в листинге 3, файл 1, я думаю, что где-то должна быть ваша проблема:

private void SomeClass1 
{  
    [snip]  
    TCOpt_fM.AutoUpdate = optAutoUpdate.Checked;  
    TCOpt_fM.WhiteList = optWhiteList.Checked;  
    TCOpt_fM.BlackList = optBlackList.Checked;  
    [snip]  

    //It is impossible to declare here a variable name that is already used
    //above.
    //But it looks like you just declared here a variable (without instantiation)
    //and trying to use it as parameter for the SaveOptions() function.
    private TCOpt TCOpt_fM;  
    TCOpt_fM.SaveOptions(TCOpt_fM);  
}

Обычно это приводит к паре сообщений об ошибках.

  • объявление имени переменной, которая уже используется в той же области
  • пытается передать объект, который не инициализирован
    • (Если вы хотите передать неинициализированный объект, вы должны инициализировать его с помощью null или использовать ключевое слово out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...