C # методы и проблема пространства имен - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть 2 приложения: библиотека классов с именем ClLib и приложение Windows Form с именем ClLibApp.

В ClLib у меня есть группа классов.

Они такие, как показано ниже:

Сингапур (родительский класс) - Детская - первичный - Вторичный

В ClLibApp мне нужно добавить ссылку из ClLib, чтобы я мог использовать свое приложение. Кодировки будут показаны ниже.

Сингапур

namespace ClLib.Singapore
{
    public class SingaporeClass
    {
        public int subtract(int firstNum, int secNum)
        {
            return firstNum - secNum;
        }
    }
}

Питомник

namespace ClLib.Singapore.Nursery
{
    public class ExchangeClass
    {
        public int subtractionNursery(int firstNum, int secNum)
        {
            return firstNum - secNum;
        }
    }
}

Первичный

namespace ClLib.Singapore.Primary
{
    public class ExchangeClass
    {
        public int subtractPrimary(int firstNum, int secNum)
        {
            return firstNum - secNum;
        }
    }
}

Вторичный

namespace ClLib.Singapore.Secondary
{
    public class ExchangeClass
    {
        public int subtractSecondary(int firstNum, int secNum)
        {
            return firstNum - secNum;
        }
    }
} 

Я не хочу помещать все методы в один класс, что означает, что я хочу иметь 3 разных подкласса вместо того, чтобы иметь только 1 подкласс, чтобы содержать все методы.

Итак, в моем ClLibApp я создаю кнопку, и мне нужна директива, которая позволяет мне показать следующее:

с использованием ClLib.Singapore; используя ClLib.Singapore.Nursery; используя ClLib.Singapore.Primary; используя ClLib.Singapore.Secondary;

Взять, к примеру, я создал кнопку с именем btnExchange, и она покажет ответы для разных методов. Я хотел бы создать его как-то так:

private void btnExchange_Click(object sender, EventArgs e)
{
   ExchangeClass ExchClass = new ExchangeClass();
   string answer = ExchClass.subtract(99,88).ToString();
   MessageBox.Show(answer);         

}

Во второй строке я хочу использовать

string answer = Exch.subtractNursery(100,694).ToString();
string answer = Exch.subtractPrimary(8484,38).ToString();
string answer = Exch.subtractSecondary(39, 764).ToString();

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

Ответы [ 2 ]

1 голос
/ 21 декабря 2009

Что-то вроде этого, используя дженерики:

В вашей сборке CILib:

public interface IExchangeClass
{
    int Subtract(int firstNum, int secNum);
}

public class SingaporeClass : IExchangeClass
{
    public int Subtract(int firstNum, int secNum)
    {
        return firstNum - secNum;
    }
}

public class NurseryClass : IExchangeClass
{
    public int Subtract(int firstNum, int secNum)
    {
        return firstNum - secNum;
    }
}

public class PrimaryClass : IExchangeClass
{
    public int Subtract(int firstNum, int secNum)
    {
        return firstNum - secNum;
    }
}

public class SecondaryClass : IExchangeClass
{
    public int Subtract(int firstNum, int secNum)
    {
        return firstNum - secNum;
    }
}

public class ExchangeHelper
{
    public int Subtract<T>(int firstNum, int secNum) where T : IExchangeClass, new ()
    {
        T exchange = new T();

        return exchange.Subtract(firstNum, secNum);
    }
}

Тогда в вашем ClLibApp вы можете сделать что-то вроде этого:

ExchangeHelper helper = new ExchangeHelper();

string answer = helper.Subtract<SingaporeClass>(10, 4).ToString();
// or string answer = helper.Subtract<NurseryClass>(10, 4).ToString();
// or string answer = helper.Subtract<PrimaryClass>(10, 4).ToString();
// or string answer = helper.Subtract<SecondaryClass>(10, 4).ToString();

return answer;
0 голосов
/ 21 декабря 2009

Есть много возможных решений, но я не понимаю, как вы планируете выбрать правильную строку для ответа.

Вы можете использовать методы расширения:

namespace ClLib.Singapore.Primary
{
  public static class ExchangeExtensions
  {
    public static int subtractPrimary(ClLib.Singapore.SingaporeClass @this, int firstNum, int secNum)
    {
      return firstNum - secNum;
    }
  }
}

Или вы можете использовать общие идеи объектно-ориентированного дизайна. Если вы посмотрите в Интернете, есть множество учебных пособий по этому вопросу. Вы хотели бы или наследование интерфейса или наследование класса. (С наследованием классов я бы предположил, что SingaporeClass является базовым, а остальные - подклассами.)

Если ни один из них не решит ваши потребности, Reflection может быть тем ответом, который вам нужен. Существует множество способов его использования, поэтому вам нужно более точно описать свою цель. (Может быть, напишите какой-нибудь псевдокод в вопрос.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...