Производный класс должен вызывать статические методы базового класса, но с переопределенным свойством - PullRequest
0 голосов
/ 15 сентября 2011

Как мне это сделать?

Сценарий:

abstract class DataAccess
{
    public abstract string ConnectionString { get; set; }

    public static DataTable ExecuteSql(string sql)
    {
        // ...
    }

    public static object ExecuteStoredProc(string storedProcName, ...)
    {
        // ...
    }
}

abstract class DataAccessDb1 : DataAccess
{
    public override string ConnectionString = "SetDbSpecificConnectionStringHere";

    public static DataTable GetStuff()
    {
        // Call the method with the ConnectionString set HERE.
        return ExecuteSql("select * from stuff");
    }
}

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

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Да: передать строку подключения в качестве параметра в метод.

  • Поля не ведут себя полиморфно, поэтому объявление в DataAccessDb1 недопустимо
  • static и полиморфизм не смешивается

Так что, по сути, если вы хотите полиморфное поведение, вы должны использовать элементы экземпляра.Если вам действительно не нужно полиморфное поведение, передайте любые варианты (например, строку подключения) в качестве параметра для метода.

0 голосов
/ 15 сентября 2011

То, что я думаю, что у вас должен быть только метод ExecuteSql в абстрактном классе, и все производные классы будут реализовывать ExecuteSql с соответствующей строкой соединения,

    public abstarct string ConnectionString{get;set;}

можно удалить из базового класса.

0 голосов
/ 15 сентября 2011

В C # нет статического наследования, поэтому ваша цель иметь ConnectionString, иметь статический член, и переопределить его не получится.Переосмыслите свой дизайн - имея ConnectionString в качестве статического, на самом деле это поле должно быть одинаковым во всех ваших DataAccess экземплярах, поскольку оно определено для самого типа.

Есть ли особая причина, по которой вы используете статические методыиспользование методов экземпляра и установка строки соединения в конструкторе будет работать:

public class DataAccessDb1
{
    public string ConnectionString {get;set;}

    public DataAccessDb1()
    {
        ConnectionString = "SetDbSpecificConnectionStringHere";
    }

    public void DataTable GetStuff()
    {
        return DataAccess.ExecuteSql(ConnectionString, "select * from stuff");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...