Инициализируйте базовый класс в.NET

Вы можете использовать мою библиотеку EntityFrameworkCoreMock в качестве базы, см. https://github.com/huysentruitw/entity-framework-core-mock

, а затем переопределить поведение SaveChanges такой метод:

dbContextMock.Setup(x => x.SaveChanges()).Callback(() => throw new Exception());

8
задан Juliet 29 January 2009 в 19:00
поделиться

9 ответов

К сожалению, base только для чтения.

[Править]
Хорошо, возможно, не настолько неудачный. Отношения между базовым классом и дочерним классом IS-A нет HAS-A. Позволяя дочернему классу изменить экземпляр базового класса Вы позволяете дочернему классу изменять свою собственную ссылку начиная с него IS-A базовый класс. Если бы Вам действительно нужна эта функциональность затем, я предложил бы, чтобы Вы изменили свою модель наследования для отражения то, что Вы действительно хотите сделать.

Что-то вроде этого:

public class A
{
    public string field1;
    public string field2;
}

public class B
{
    public string field3;
    public A a;

    public void Assign(A source)
    {
        this.a = source;
    }
}

кажется более соответствующим и имеет более четкое значение и функциональность.

18
ответ дан 5 December 2019 в 04:43
поделиться

В то время как существует много превосходных ответов здесь, я думаю надлежащий способ сделать, это путем объединения в цепочку конструкторов:

public class A
{
    public string field1;
    public string field2;

    public A(string field1, string2 field2)
    {
         this.field1 = field1;
         this.field2 = field2;
    }
}

public class B : A
{
    public string field3;

    public B(string field1, string2 field2, string field3)
        : base(field1, field2)
    {
        this.field3 = field3;
    }
}
5
ответ дан 5 December 2019 в 04:43
поделиться

Состоит в том намерение, что эти поля будут инициализированы однажды во время объектной конструкции или могли "Присвоиться" быть названными многократно в течение времени жизни объекта? Если последний, можно игнорировать остальную часть этого :)

Различие Andrew между ISA и ИМЕЕТ - A, важный; если отношениями действительно является - A, его решением для состава является способ пойти.

Если отношения ISA имеют больше смысла (и Вы можете изменить A), конструктор копии мог бы быть хорошей идеей:

public class A
{
    public string field1;
    public string field2;

    public A(A copyFrom)
    {
        this.field1 = copyFrom.field1;
        this.field2 = copyFrom.field2;
    }
}

public class B : A
{
    public string field3;

    public B(A source)
        : base(source)
    {
    }
}

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

3
ответ дан 5 December 2019 в 04:43
поделиться
        public Assign(A a)
        {
            foreach (var prop in typeof(A).GetProperties())
            {
                this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(a, null),null);
            }
        }

В основном это использует отражение, чтобы получить все свойства основы и присвоить значения этого ко всем значениям, которые существуют в A.

Править: Ко всему Вы голосующие против там, я быстро протестировал это теперь с базовым классом, который имел 100 целочисленных переменных. Я затем имел, это присваивает метод в подклассе. Потребовалось 46 миллисекунд для выполнения. Я не знаю о Вас, но я соглашаюсь полностью с этим.

10
ответ дан 5 December 2019 в 04:43
поделиться

Нет синтаксис, который Вы пробуете, не возможен в.NET C#, которую необходимо сделать.

public void Assign(A source) {
    field1 = source.field1;
    field2 = source.field2; 
}
4
ответ дан 5 December 2019 в 04:43
поделиться

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

public class A
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

public class B
{
    public A A { get; set; }
    public string Field3 { get; set; }

    public B(A a) { this.A = a; }
}

Теперь его тривиальное для записи чего-то вроде этого:

B b = new B ( new A { Field1 = "hello", Field2 = "world" } );

b.A = new A { Field1 = "hola", Field2 = "luna" };
1
ответ дан 5 December 2019 в 04:43
поделиться

Почему Вы должны были бы? Путем объявления нового B CLR автоматически вызывает конструкторов для обоих классов.

B myB = new B();

B новый имеет поля обоих классов. Однако необходимо объявить их с инициализатором, если Вам не нравится, аннулирует:

public string field1 = "";
public string field2 = string.Empty;
1
ответ дан 5 December 2019 в 04:43
поделиться

Неправильный вопрос. Вы, очевидно, злоупотребляете наследованием здесь. Попытайтесь осуществить рефакторинг его, так, чтобы Вы сохранили ссылку на как членское поле. Если Вы нуждаетесь в полиморфизме, рассматриваете общий базовый класс наличия или еще лучше - интерфейс.

1
ответ дан 5 December 2019 в 04:43
поделиться

Согласно MSDN, "основа" может внутренне использоваться для следующих операций:

  • Назовите метод на базовом классе, который был переопределен другим методом.
  • Укажите, какого конструктора базового класса нужно вызвать при создании экземпляров производного класса.
0
ответ дан 5 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: