Свойства C#

6yrop

Разделить сетор и гетор на два интерфейса
public interface IA
{
int GetP;
}
public interface IB: IA
{
void SetP(int value);
}
через свойсва это сделать нельзя?

bleyman



public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet
{
int Z
{
set;
}
}
public class ZZ : ZGet, ZSet
{
public int Z
{
get
{
return 0;
}
set
{
}
}
}


Компилиццо. Значит, можно =)
ЗЫ: Вот ты блин человек ленивый!

6yrop

имхо, не совсем удачное решение. В моем примере IB наследуется от IA, а в твоей реализации потребуется третий интерфейс, который наследуется от IA и IB. Лишний интерфей -- это как-то нехорошо, чере функции, имхо, более подходящий вариант.
P.S. не надо необосновано обвинять человека в лени

bleyman

ггг.


public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet : ZGet
{
new int Z
{
get;
set;
}
}
public class ZZ : ZSet
{
public int Z
{
get
{
return 0;
}
set
{
}
}
}


Все работает, я проверил.
P.S. не надо необосновано обвинять человека в лени
=) Необоснованно? =)

6yrop

ха-ха, я тоже видел, что компилятор предлагает слово new поставить, но вот получится совсем не то что хочется. Подумай или почитай почему (если ты такой неленивый).

bleyman

ха-ха, я тоже видел, что компилятор предлагает слово new поставить, но вот получится совсем не то что хочется. Подумай или почитай почему (если ты такой неленивый).

Не понимаю. А что тебе хочется?
Такой код


ZZ z = new ZZ;
int a = 10;
ZSet zs = (ZSet)z;
zs.Z = a;
a = zs.Z;
ZGet zg = (ZGet)z;
a = zg.Z;


Прекрасно работает...
Или ты хочешь помимо наследования интерфейсов еще и имплементирующие их классы друг от друга наследовать?

Dasar

> ха-ха, я тоже видел, что компилятор предлагает слово new поставить, но вот получится совсем не то что хочется. Подумай или почитай почему (если ты такой неленивый).
На первый взгляд, этот new никаких серьезных side-эффектов в данном случае не дает.

6yrop

вообще, да, действидельно.
P.S. (На досуге как-нибудь подумаю получше об этом).

rosali

На первый взгляд, этот new никаких серьезных side-эффектов в данном случае не дает.

Народ, вас чего-то глючит!
Этот new означает, что ZSet.Z.get не имеет _никакого_ отношения к ZGet.Z.get, то есть по этому методу нет полиморфизма. Как бы случайно имена совпали. Нафига тогда вообще наследование? Вот напишете вы


public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet : ZGet
{
new int Z
{
get;
set;
}
}

public class ZZGet : ZGet
{
public int Z
{
get
{
return 0;
}
}
}
public class ZZSet : ZZGet, ZSet
{
new public int Z
{
set
{
}
get
{
return(1);
}
}
}


(Обращаю внимание, что снова пришлось new сказать!)
А потом


ZZSet x = new ZZSet;
ZZGet y = x;
System.Console.WriteLine(x.Z);
System.Console.WriteLine(y.Z);


И будете удивляться, что x.Z == 1, а y.Z все еще == 0. Клево отнаследовались!

bleyman

Слушай!
Не путай интерфейсы и классы!
В случае наследующихся друг от друга интерфейсов полиморфизма вообще не может быть, потому что не может быть никогда, ИМХО! Потому что интерфейсы - это не классы! Я не понимаю, как можно говорить о полиморфизме применительно к чему-нибудь, в чем нет кода.
Так вот, а если ты хочешь наследоваться от класса, который уже имплементирует (хотя бы частично) интерфейс, который ты тоже типа имплементируешь, то тебе по любому придеццо заниматься разными извращениями, которые, по большому счету, не имеют никакого отношения к обсуждаемой теме. Конечно, в случае пропертей тебе будет немножко тяжелее это делать, чем если бы у тебя были бы функции.
Кстати, мне кажется, что то, что возникают подобные непонятности и недоразумения - это Мировой Порядок Вещей намекает нам что мы хуйню делаем, и что надо быть проще, а то сами же потом через полгода будем дуплить в прогу и не понимать, что у нас от чего отнаследовано. Именно поэтому я только что решил поэкспериментировать с виртуальными пропертями, а потом решил, что я, пожалуй, воздержусь.
ЗЫ: Не стоит воспринимать этот пост как наезд. А то че-тго задолбали воспринимать мои посты как наезды =)

bleyman

Это я к тому, что new в объявлении интерфейса не имеет никакого отношения к new в объявлении класса.
А вообще так писАть, конечно, не стОит.

rosali

Так! А ну не гнать!
new в обоих случаях в точности одинакового смысла, оно означает "не переопределять (override) старый метод а завести новый, просто с таким же именем, случайно. Выдать этому методу отдельный слот в _vtable."
Так вот если этот пример переписать с пропертей на обычные методы, то new нигде писать не приходится, а надо писать override, и все нормально полиморфируется:


public interface ZGet
{
int Z_get;
}
public interface ZSet : ZGet
{
void Z_set(int z);
}

public class ZZGet : ZGet
{
public virtual int Z_get
{
return 0;
}
}
public class ZZSet : ZZGet, ZSet
{
public void Z_set(int z)
{
}
public override int Z_get
{
return 1;
}
}
class MainClass
{
[STAThread]
static void Main(string[] args)
{
ZZSet zzset = new ZZSet;
ZZGet zzget = zzset;
ZGet zget1 = zzset;
ZGet zget2 = zzget;
ZSet zset = zzset;
System.Console.WriteLine(zzset.Z_get;
System.Console.WriteLine(zzget.Z_get;
System.Console.WriteLine(zget1.Z_get;
System.Console.WriteLine(zget2.Z_get;
System.Console.WriteLine(zset.Z_get;
System.Console.ReadLine;
}
}



Output:
1
1
1
1
1

А в случае new, которое приходится писать при варианте с пропертями, многие из этох единиц останутся нулями. Вот.

bleyman

А я знаю толк в извращениях!
Зацени так:


public class ZZGet : ZGet
{
public virtual int Z
{
get { return 0; }
}
}
public class ZZSet : ZZGet, ZSet
{
public override int Z
{
get {return 1;}
}
int ZSet.Z
{
get {return Z;}
set {}
}
}


=) =) =)
Таки тоже все единички в твоем мейне!

rosali

Ну да, все правильно, redirect пришлось написать... Вобщем автор треда много полезного из нашей дискуссии извлечет!
Оставить комментарий
Имя или ник:
Комментарий: