не найдено подходящего метода для переопределения ошибки с частичным классом - PullRequest
2 голосов
/ 29 октября 2010

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

using System;

namespace BaseNameSpace
{
  public class BaseClass
  {
    public int Num;
    public double dNum;
    public BaseClass(int s, double d)
    {
      Num = s;
      dNum = d;
    }

    public virtual void Wrt()
    {
      Console.WriteLine("{0},{1}", Num, dNum);
    }
  }
}

Я добавляю другой сборочный проект, названный производным классом пространства, и объявляю производный класс, производный от базового класса. я также добавлю частичное определение класса в этот проект.

using System;
using BaseNameSpace;

namespace BaseNameSpace
{
  public partial class BaseClass
  {
    public void Mult()
    {
      Num *= 2;
    }
  }
}

namespace DerivedNameSpace
{
  public class DerivedClass : BaseClass
  {
    public DerivedClass(int s)
      : base(s, 0)
    {

    }

    public override void Wrt()
    {

      Mult(); // mult line
      base.Wrt();
    }
  }
}

когда я строю решение, я получаю

DerivedNameSpace.DerivedClass.Wrt () ': не найдено подходящего метода для переопределения

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

Ответы [ 2 ]

7 голосов
/ 29 октября 2010

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

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

namespace BaseNameSpace
{
  public static class BaseClassExtensions
  {
    public static void Mult(this BaseClass instance)
    {
      instance.Num *= 2;
    }
  }
}

namespace DerivedNameSpace
{
  public class DerivedClass : BaseClass
  {
    public DerivedClass(int s)
      : base(s, 0)
    {

    }

    public override void Wrt()
    {

      Mult(); // mult line
      base.Wrt();
    }
  }
}
0 голосов
/ 29 октября 2010

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

...