Взаимодействие между классами и структурой - PullRequest
0 голосов
/ 02 ноября 2011

ОК, поэтому класс в моем проекте проходит через этот метод.

public static MemberName SplitTdsName(string tdsName)
    {
        NameSplitter preSplitName = new NameSplitter(tdsName);
        return preSplitName;
    }

MemberName является структурой:

public struct MemberName
{
    public string Title;
    public string FirstNames;
    public string LastNames;

    public MemberName(string title, string firstNames, string lastNames)            
    {            
        Title = title;
        FirstNames = firstNames;
        LastNames = lastNames;
    }
}

И класс NameSplitter:

public NameSplitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();
        MemberName splitName = new MemberName(titles, firstNames, lastNames);
        return splitName;
    }

Это не будет работать, потому что когда я изменяю public NameSplitter на public MemberName NameSplitter, метод SplitTdsName сообщает мне, что у NameSplitter нет метода, который принимает один аргумент.

Я не знаю, как обойти это или заставить его работать . Нужно ли менять NameSplitter на NameSplitter статическим классом?

Примечание: Я ЗНАЮ, что КОД НЕПРАВИЛЬНЫЙ

Пошли с:

public static MemberName SplitTdsName(string tdsName)
    {
        return NameSplitter.NameSplitter(tdsName);
    }

public static MemberName NameSplitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();
        MemberName splitName = new MemberName(titles, firstNames, lastNames);
        return splitName;
    }

    public MemberName(string title, string firstNames, string lastNames)            
    {            
        Title = title;
        FirstNames = firstNames;
        LastNames = lastNames;
    }

Ответы [ 6 ]

3 голосов
/ 02 ноября 2011

В вашем коде есть несколько проблем, очевидно, что он не скомпилируется.

1) Вы не можете иметь return в конструкторе.

public NameSplitter(string fullName)
{
     ...
     return splitName;
}

2) Тип возврата и оператор возврата должны согласовываться. Здесь вы возвращаете NameSplitter, но функция обещала MemberName:

public static MemberName SplitTdsName(string tdsName)
{
   NameSplitter preSplitName = new NameSplitter(tdsName);
   return preSplitName;
}

Как быстрое исправление (возможно, не полное и не проверенное)

// class NameSplitter
public NameSplitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();
        //MemberName splitName = new MemberName(titles, firstNames, lastNames);
        //return splitName;
    }

public MemberName MemberName   // readonly property
{
    get { return new MemberName(titles, firstNames, lastNames); }
}

И тогда метод становится

public static MemberName SplitTdsName(string tdsName)
{
    NameSplitter preSplitName = new NameSplitter(tdsName);
    return preSplitName.MemberName ;
}

Но я не уверен, что MemberName должен быть структурой, класс также будет хорошим выбором.

1 голос
/ 02 ноября 2011

// Существующий код

public struct MemberName
{
    public string Title;
    public string FirstNames;
    public string LastNames;

    public MemberName(string title, string firstNames, string lastNames)            
    {            
        Title = title;
        FirstNames = firstNames;
        LastNames = lastNames;
    }
}

// Измененный код ниже

public class NameSplitter
{

    // Added a property for returning splitName value thru' class
    private MemberName splitName;
    public MemberName SplitName
    {
        get { return splitName; }
        private set { splitName = value; }
    }

    public NameSplitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();

        splitName = new MemberName(titles, firstNames, lastNames);

       // return splitName; // Can't be done in a constructor and has to be returned via public property
    }
}
1 голос
/ 02 ноября 2011

Попробуйте реализовать класс как:

    public static class NameSplitter
    {
        public static MemberName Split(string fullName)
        {
            ...
            MemberName splitName = new MemberName(titles, firstNames, lastNames);
            return splitName;
        }
    }

, а затем использовать как MemberName mn = NameSplitter.Split("<your data here>");

Финальный код может выглядеть так:

    public static class YourClass
    {
        ...
        public static MemberName SplitTdsName(string tdsName)
        {
            MemberName preSplitName = NameSplitter.Split(tdsName);
            return preSplitName;
        }
    }

    public static class NameSplitter
    {
        ...
        public static MemberName Split(string fullName)
        {
            nameInFull = fullName;
            SetAllowedTitles();
            SplitNamesAndRemovePeriods();
            SetTitles();
            MemberName splitName = new MemberName(titles, firstNames, lastNames);
            return splitName;
        }
    }

    public struct MemberName
    {
        public string Title;
        public string FirstNames;
        public string LastNames;

        public MemberName(string title, string firstNames, string lastNames)
        {
            Title = title;
            FirstNames = firstNames;
            LastNames = lastNames;
        }
    }
1 голос
/ 02 ноября 2011

Вы должны сделать метод статическим методом, который возвращает MemberName и назначить результат переменной MemberName, а не NameSplitter (в вашем методе SplitTdsName)

0 голосов
/ 02 ноября 2011

Я считаю, что вы должны вернуться к своей Библии на C # и пересмотреть то, что вы пытаетесь достичь, и дизайн.

Чтобы ответить на ваш вопрос, см. Переработанный образец

class Program
{
    static void Main(string[] args)
    {
    }
    public static MemberName SplitTdsName(string tdsName)
    {
        NameSplitter preSplitName = new NameSplitter(tdsName);
        return preSplitName.GetMemberName();
    } 
}
public struct MemberName
{
    public string Title;
    public string FirstNames;
    public string LastNames;

    public MemberName(string title, string firstNames, string lastNames)
    {
        Title = title;
        FirstNames = firstNames;
        LastNames = lastNames;
    }
}
public class NameSplitter
{
    MemberName _memberName;
    public NameSplitter(string fullName)
    {
        _memberName = new MemberName("title", "firstName", "lastName");
    }

    public MemberName GetMemberName()
    {
        return _memberName;
    }
}
0 голосов
/ 02 ноября 2011

1)

public static MemberName SplitTdsName(string tdsName)
    {
        NameSplitter preSplitName = new NameSplitter(tdsName);
        return preSplitName; // I don't understand why you're returning NameSplitter
                             // when method's return type is MemberName.
    }

2)

public NameSplitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();
        MemberName splitName = new MemberName(titles, firstNames, lastNames);
        return splitName; // How would a constructor return something?
    }
...