Thread overview
shared interfaces
Feb 15, 2015
Andrey Derzhavin
Feb 15, 2015
anonymous
Feb 15, 2015
Andrey Derzhavin
Feb 15, 2015
anonymous
Feb 15, 2015
Andrey Derzhavin
Feb 15, 2015
Andrey Derzhavin
February 15, 2015
interface IA
{
	void fnA();
}


interface IB
{
	void fnB();
}


shared interface IC : IA, IB
{
	void fnC();
}



shared class C : IA, IB
{

	override void fnA() // Error: function main.C.fnA does not override any function, did you mean to override 'main.IA.fnA'?
	{

	}

	override void fnB() // Error: function main.C.fnB does not override any function, did you mean to override 'main.IA.fnA'?
	{

	}


shared class D : IC
{
	
	override void fnC()
	{
	}
	
	override void fnA() // Error: function main.D.fnA does not override any function, did you mean to override 'main.IA.fnA'?
	{
		
	}
	
	override void fnB() // Error: function main.D.fnB does not override any function, did you mean to override 'main.IB.fnB'?
	{
		
	}
}

what is wrong in declarations, if I need to declare shared classes D and C?
February 15, 2015
On Sunday, 15 February 2015 at 10:43:46 UTC, Andrey Derzhavin wrote:
> what is wrong in declarations, if I need to declare shared classes D and C?

`shared` on a class/interface makes all members shared. And that's all it does.

So this:

----
interface IA
{
    void fnA();
}
shared class C : IA
{
    override void fnA() {}
}
----

is the same as this:

----

interface IA
{
    void fnA();
}
class C : IA
{
    override void fnA() shared {}
}
----

But you can't override a non-shared method with a shared one, hence the error.

So, if you need to override non-shared methods, you can't mark the whole class shared. Instead, you have to mark the shared members individually. Like so:

----
interface IA
{
    void fnA();
}
shared interface IC : IA
{
    void fnC();
}
class D : IC
{
    override void fnC() shared {}
    override void fnA() {}
}
----
February 15, 2015
On Sunday, 15 February 2015 at 11:30:46 UTC, anonymous wrote:
> On Sunday, 15 February 2015 at 10:43:46 UTC, Andrey Derzhavin wrote:
>> what is wrong in declarations, if I need to declare shared classes D and C?
>
> `shared` on a class/interface makes all members shared. And that's all it does.
>
> So this:
>
> ----
> interface IA
> {
>     void fnA();
> }
> shared class C : IA
> {
>     override void fnA() {}
> }
> ----
>
> is the same as this:
>
> ----
>
> interface IA
> {
>     void fnA();
> }
> class C : IA
> {
>     override void fnA() shared {}
> }
> ----
>
> But you can't override a non-shared method with a shared one, hence the error.
>
> So, if you need to override non-shared methods, you can't mark the whole class shared. Instead, you have to mark the shared members individually. Like so:
>
> ----
> interface IA
> {
>     void fnA();
> }
> shared interface IC : IA
> {
>     void fnC();
> }
> class D : IC
> {
>     override void fnC() shared {}
>     override void fnA() {}
> }
> ----
Try to compile your example, it is wrong.
February 15, 2015
On Sunday, 15 February 2015 at 12:34:50 UTC, Andrey Derzhavin wrote:
> On Sunday, 15 February 2015 at 11:30:46 UTC, anonymous wrote:
[...]
>> ----
>> interface IA
>> {
>>    void fnA();
>> }
>> shared interface IC : IA
>> {
>>    void fnC();
>> }
>> class D : IC
>> {
>>    override void fnC() shared {}
>>    override void fnA() {}
>> }
>> ----
> Try to compile your example, it is wrong.

Hm? Works for me. What error do you get, or what doesn't work? Which compiler are you using, which version?
February 15, 2015
On Sunday, 15 February 2015 at 14:59:20 UTC, anonymous wrote:

> Hm? Works for me. What error do you get, or what doesn't work? Which compiler are you using, which version?


The error "Error: function main.C.fnA does not
override any function, did you mean to override 'main.IA.fnA'?" has occured ((
I'm using DMD 2.066.1 compiler.
February 15, 2015
On Sunday, 15 February 2015 at 14:59:20 UTC, anonymous wrote:

Sorry everything is OK. It's my fault. Thanks))