Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 分离策略模式返回的类型_Design Patterns_Covariance - Fatal编程技术网

Design patterns 分离策略模式返回的类型

Design patterns 分离策略模式返回的类型,design-patterns,covariance,Design Patterns,Covariance,我对一些代码有问题。为了切中要害,我做了一个尽可能简单的类比——请原谅任何语法错误,因为我对编程很生疏,我很快就把它组合起来了 我的想法是,我有一些实现策略的类。我需要管理它们的对象以某种方式识别操作返回的类型,以便处理它(可能没有向下转换)-不要问,这不在我的控制之下 我考虑过使用协变返回类型来避免显式引用具体的实现(尽管那时我必须编写一个处理每个类型的函数,但对我来说似乎没问题,因为所有内容都保持在一起,对于一个新类型,您只需添加一个新函数) 公共抽象类艺术品 { } 公共级绘画延伸艺术品

我对一些代码有问题。为了切中要害,我做了一个尽可能简单的类比——请原谅任何语法错误,因为我对编程很生疏,我很快就把它组合起来了

我的想法是,我有一些实现策略的类。我需要管理它们的对象以某种方式识别操作返回的类型,以便处理它(可能没有向下转换)-不要问,这不在我的控制之下

我考虑过使用协变返回类型来避免显式引用具体的实现(尽管那时我必须编写一个处理每个类型的函数,但对我来说似乎没问题,因为所有内容都保持在一起,对于一个新类型,您只需添加一个新函数)

公共抽象类艺术品
{
}
公共级绘画延伸艺术品
{
公共绘画()
{
}
//这里有很多画
}
公共类歌曲扩展艺术品
{
公歌()
{
}
//这里有很多歌曲
}
公共类图书扩展艺术品
{
公共书籍()
{
}
//这里有书吗
}
///////////////////////////////////////////////////
公共抽象类艺术家
{
公共抽象艺术品创作();
}
公共级画家和艺术家
{
公共画家()
{
}
公共绘画创作()
{
归还新画();
}
}
公共级音乐家和艺术家
{
公共音乐人()
{
}
公共歌曲创建()
{
返回新歌();
}
}
公共阶层作家和艺术家
{
公共作家()
{
}
公共图书创建()
{
归还新书();
}
}
//////////////////////////////////////////////////
公共类艺术品收藏家
{
私人艺术家[]艺术家;
私人绘画[]绘画;
私人歌曲[]歌曲;
私人书籍[]书籍;
私人跟随者;
私人内画;
私人拥有的歌曲;
私人拥有的书籍;
公共艺术品收藏家()
{
跟随者=0;
拥有的绘画=0;
ownedSongs=0;
拥有图书=0;
艺术家=新艺术家[3];
绘画=新绘画[3];
歌曲=新歌[3];
书籍=新书[3];
}
公共空间跟随艺术家(艺术家a)
{
if(followerDartists
首先,我还没有测试过这种方法。这只是我必须处理这个问题的一个想法

我想知道你对这件事的看法——我走对了吗

您认为有更好的方法来处理这个问题吗?

Hmmm.更多关于可运行代码的问题,如下所示。这感觉更像是架构查询,更适合于上下或类似的研究。你的代码无法编译。你需要学习一些基础知识,比如集合和泛型。
    public abstract class ArtPiece
{
}

public class Painting extends ArtPiece
{
    public Painting()
    {
    }

    // paintings stuff here
}

public class Song extends ArtPiece
{
    public Song()
    {
    }

    // songs stuff here
}

public class Book extends ArtPiece
{
    public Book()
    {
    }

    // books stuff here
}

///////////////////////////////////////////////////

public abstract class Artist
{
    public abstract ArtPiece create();
}

public class Painter extends Artist
{
    public Painter()
    {
    }

    public Painting create()
    {
        return new Painting();
    }
}

public class Musician extends Artist
{
    public Musician()
    {
    }

    public Song create()
    {
        return new Song();
    }
}

public class Writer extends Artist
{
    public Writer()
    {
    }

    public Book create()
    {
        return new Book();
    }
}

//////////////////////////////////////////////////

public class ArtCollector
{
    private Artist[] artists;
    private Painting[] paintings;
    private Song[] songs;
    private Book[] books;

    private int followedArtists;
    private int ownedPaintings;
    private int ownedSongs;
    private int ownedBooks;

    public ArtCollector()
    {
        followedArtists = 0;
        ownedPaintings = 0;
        ownedSongs = 0;
        ownedBooks = 0;

        artists = new Artist[3];
        paintings = new Painting[3];
        songs = new Song[3];
        books = new Book[3];
    }

    public void followArtist(Artist a)
    {
        if (followedArtists < artists.length)
        {
            artists[followedArtists++] = a;
            return;
        }
        System.out.println("Too many artists to follow!");
    }

    public void commissionArt(int id)
    {
        storeArtPiece(artists[id].create());
    }

    private void storeArtPiece(Painting p)
    {
        if (ownedPaintings < paintings.length)
        {
            paintings[ownedPaintings++] = p;
            return;
        }
        System.out.println("Too many paintings to store!");
    }

    private void storeArtPiece(Song s)
    {
        if (ownedSongs < songs.length)
        {
            songs[ownedSongs++] = s;
            return;
        }
        System.out.println("Too many songs to store!");
    }

    private void storeArtPiece(Book b)
    {
        if (ownedBooks < books.length)
        {
            books[ownedBooks++] = b;
            return;
        }
        System.out.println("Too many books to store!");
    }

    public void countPaintings()
    {
        System.out.println("I own " + paintings.length.toString() + " paintings.");
    }

    public void countSongs()
    {
        System.out.println("I own " + songs.length.toString() + " songs.");
    }

    public void countBooks()
    {
        System.out.println("I own " + books.length.toString() + " books.");
    }
}

//////////////////////////////////////////////////

public static void main(string[] args)
{
    ArtCollector collector = new ArtCollector();

    collector.followArtist(new Musician());
    collector.followArtist(new Painter());
    collector.followArtist(new Writer());

    collector.commissionArt(0);
    collector.commissionArt(0);
    collector.commissionArt(1);
    collector.commissionArt(2);
    collector.commissionArt(1);
    collector.commissionArt(0);
    collector.commissionArt(0);

    collector.countPaintings();
    collector.countSongs();
    collector.countBooks();
}