Реализация членов абстрактного класса в наследниках
От: Andrew Merkulov Россия www.ibprovider.com
Дата: 25.08.04 06:04
Оценка:
Добрый день!
Возникла следующая задача:
Есть абстрактный класс:
class abstract TDataObject
    {
    //строка в DataTable
    public DataRow Row;
    //состояние строки
    public DataRowState State {get {return Row.RowState;}}
    }


И есть наследующие абстрактный класс
class TConcreteDataObject : TDataObject
    {
      //типизированная строка, наследуюая DataRow должна заместить DataRow   
        //в абстрактном классе
        override TypedDataRow Row;
        
        Some methods .....
    }


На данную реализацию компилятор ругается!
Возможно ли заменять члены абстрактного класса в наследниках членами,унаследованными от членов абстрактного класса? если да то как ?

Если нет то возможен ли ещё вариант чтобы для типизированных строк определить общую логику поведения на уровне DataRow, а конкретную реализацию в каждом конкретном классе?
... << RSDN@Home 1.1.3 stable >>


Немного обо мне, и моем круге
Мои профиль в LiveLib &mdash; книги
Re: Реализация членов абстрактного класса в наследниках
От: Ransom Stark Россия  
Дата: 25.08.04 07:00
Оценка:
Здравствуйте, Andrew Merkulov, Вы писали:

AM>Добрый день!

AM>Возникла следующая задача:
AM>На данную реализацию компилятор ругается!
AM>Возможно ли заменять члены абстрактного класса в наследниках членами,унаследованными от членов абстрактного класса? если да то как ?

AM>Если нет то возможен ли ещё вариант чтобы для типизированных строк определить общую логику поведения на уровне DataRow, а конкретную реализацию в каждом конкретном классе?

Использовать вместо поля виртуальное свойство.
Re: Реализация членов абстрактного класса в наследниках
От: Apollo13 Украина  
Дата: 25.08.04 07:17
Оценка:
Здравствуйте, Andrew Merkulov, Вы писали:


AM>На данную реализацию компилятор ругается!

AM>Возможно ли заменять члены абстрактного класса в наследниках членами,унаследованными от членов абстрактного класса? если да то как ?

Use the override modifier to modify a method, a property, an indexer, or an event.


AM>Если нет то возможен ли ещё вариант чтобы для типизированных строк определить общую логику поведения на уровне DataRow, а конкретную реализацию в каждом конкретном классе?


Использовать открытые переменные в таком случае нельзя. Нужно объявлять свойства вместо переменных, а в классе наследнике новое свойство помечать new. В данном случае объявлять переменную в абстрактном классе вобще не нужно.
Re[2]: Реализация членов абстрактного класса в наследниках
От: Andrew Merkulov Россия www.ibprovider.com
Дата: 25.08.04 08:23
Оценка:
Здравствуйте, Apollo13, Вы писали:

A>Здравствуйте, Andrew Merkulov, Вы писали:



AM>>На данную реализацию компилятор ругается!

AM>>Возможно ли заменять члены абстрактного класса в наследниках членами,унаследованными от членов абстрактного класса? если да то как ?

A>

A>Use the override modifier to modify a method, a property, an indexer, or an event.


Прошу прощения, там были определены свойства, а не переменные...

class abstract TDataObject
    {
    //строка в DataTable 
    public abstract DataRow Row {get{}set{}};
    //состояние строки
    public DataRowState State {get {return Row.RowState;}}
    }


И в наследнике соотвественно в общем виде вот так:
class TConcreteDataObject : TDataObject
    {
            private TypedDataRow row;
            
      //типизированная строка, наследуюая DataRow должна заместить DataRow   
      //в абстрактном классе
        public TypedDataRow Row {get{return row;};set{}};
        
        Some methods .....
    }


И при получении ((TDataObject)Instance).State вернуло бы состояние TConcreteDataObject.Row.State

Это нормально реализуется с абстрактыми членами в случае если их тип совпадает с типом в наследниках, а в данном случае хотелось бы подменить базовый тип унаследованными от базового
... << RSDN@Home 1.1.3 stable >>


Немного обо мне, и моем круге
Мои профиль в LiveLib &mdash; книги
Re[3]: Реализация членов абстрактного класса в наследниках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.08.04 11:44
Оценка: 6 (1)
Здравствуйте, Andrew Merkulov, Вы писали:

AM>Это нормально реализуется с абстрактыми членами в случае если их тип совпадает с типом в наследниках, а в данном случае хотелось бы подменить базовый тип унаследованными от базового


Этот фокус обычно делается при помощи интерфейсов:
public interface IDataObject
{
    DataRow Row {get; set;}
    DataRowState State {get;}
}

public class DataObjectBase : IDataObject
{
    DataRow IDataObject.Row
    {
        get { return InternalRow; }
    }
    
    protected abstract DataRow InternalRow { get; }
    
    public DataRowState State
    {
        get { return Row.RowState; }
    }
}

public class SomeDataObject : DataObjectBase
{
    private TypedDataRow _row;
    
    public TypedDataRow Row
    {
        get { return _row; }
    }

    protected override DataRow InternalRow
    {
        get { return Row; }
    }
}
... << RSDN@Home 1.1.4 beta 2 rev. 170>>
AVK Blog
Re[4]: Реализация членов абстрактного класса в наследниках
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 11:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Этот фокус обычно делается при помощи интерфейсов:


Откровенно говоря интерфейсы тут необязательны. Наоборот абстрактыне методы хороший путь реализовать большую часть интерфейса в базовом классе и позволить переопределять его отдельные методы в наследниках.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Реализация членов абстрактного класса в наследниках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.08.04 14:09
Оценка:
Здравствуйте, VladD2, Вы писали:

AVK>>Этот фокус обычно делается при помощи интерфейсов:


VD>Откровенно говоря интерфейсы тут необязательны. Наоборот абстрактыне методы хороший путь реализовать большую часть интерфейса в базовом классе и позволить переопределять его отдельные методы в наследниках.


Ты исходный вопрос прочел? Можешь предложить решение задачи без интерфейсов?
... << RSDN@Home 1.1.4 beta 2 rev. 172>>
AVK Blog
Re[6]: Реализация членов абстрактного класса в наследниках
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 18:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ты исходный вопрос прочел? Можешь предложить решение задачи без интерфейсов?


Прочел. Там без интерфейса обойтись легко.

class abstract TDataObject
{
    //строка в DataTable
    public abstract DataRow Row { get; }
    //состояние строки
    public DataRowState State { get { return Row.RowState; } }
}

...

class TConcreteDataObject : TDataObject
{
    //типизированная строка, наследуюая DataRow должна заместить DataRow   
    //в абстрактном классе
    public override DataRow Row
    {
        get
        {
            ...
            return ...
        }
    }[/b]
    
}
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Реализация членов абстрактного класса в наследниках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.08.04 22:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Прочел. Там без интерфейса обойтись легко.


Твое решение хуже, поскольку при необходимости вызова методов специализированного типа тебе придется делать приведение, а компилятор не проверит правильность используемого типа. Для внутреннего пользования такой вариант прокатит, а вот во вне такой интерфейс совать не стоит.
... << RSDN@Home 1.1.4 beta 2 rev. 172>>
AVK Blog
Re[8]: Реализация членов абстрактного класса в наследниках
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.04 16:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Твое решение хуже, поскольку при необходимости вызова методов специализированного типа тебе придется делать приведение, а компилятор не проверит правильность используемого типа. Для внутреннего пользования такой вариант прокатит, а вот во вне такой интерфейс совать не стоит.


Читал... долго думал... о чем это ты?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.